将父视图的 ID 传递给子视图并在控制器中使用它 - ASP.NET MVC 5

Pass id of parent view to child view and use it in controller - ASP.NET MVC 5

我在将父 ID 发送到子 ID 时遇到问题,即使我这样做了,我也只想显示特定父的子数据。在我的代码中,List 是父项,Notes 是子项。当我创建一个列表时,我已经重定向到 Notes Index Page (Different Controller) 以及 ID,但在所有列表中,我可以看到相同的注释。我在 NotesController 中使用 TempData 来保留该 ID。

列表控制器:

//Index
public ActionResult Index()
{
   return View(db.Lists.ToList());
}
//Create
public ActionResult Create()
{
   return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ListViewModel lists)
{
   if (ModelState.IsValid)
   {
      Lists list = new Lists();
      list.CreationDate = DateTime.Now;
      list.ListName = lists.ListName;

      db.Lists.Add(list);
      db.SaveChanges();

      int? idFromView = list.Id;

      return RedirectToAction("Index", "NotesInLists", new { id = idFromView });
   }
   return View(lists);
}

笔记控制器:

//Index
public ActionResult Index(int? id)
{
   TempData["idFromView"] = id;
   return View(db.NotesInLists.ToList());
}

//Create
public ActionResult CreateWithtext()
{
   return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateWithtext(NoteTagViewModel notesInList)
{
   if (ModelState.IsValid)
   {
      List<string> TagsList = notesInList.TagsList.Split(',').ToList();
      NotesInList note = new NotesInList();

      int tempDataId = (int)TempData["idFromView"];

       note.CreationDate = DateTime.Now;
       note.ListName = notesInList.ListName;
       note.TextDescription = notesInList.TextDescription;
       note.listID = tempDataId;    

       db.NotesInLists.Add(note);
       db.SaveChanges();

       //saving tags
       foreach (var item in TagsList)
       {
          Tags tag = new Tags();
          tag.CreationDate = DateTime.Now;
          tag.TagName = item;
          tag.Note_Id = note.Id;
          db.Tags.Add(tag);
       }
       db.SaveChanges();
       return RedirectToAction("Index", new { id = tempDataId });
    }
    return View(notesInList);
}

在这里,在这个 NotesController 中,我也保存了标签并且它工作正常,但主要问题是 List。也使用 ViewModels 但现在我不关心这个。如果我尝试使用

访问列表
Lists list = new List();

我仍然无法检查该 ID 并将其与该列表 ID 进行比较,它会引发异常。

列表型号:

namespace NoteBlocks.Models
{
    public class Lists
    {
        public int Id { get; set; }

        [Required]
        [Display(Name = "List Name")]
        public string ListName { get; set; }

        [Display(Name = "Creation Date")]
        public DateTime? CreationDate { get; set; }

        [Display(Name = "Last Updated")]
        public DateTime? UpdateDate { get; set; }
    }
}

列出视图模型:

namespace NoteBlocks.ViewModels
{
    public class ListViewModel
    {
        public int Id { get; set; }

        [Required]
        [Display(Name = "List Name")]
        public string ListName { get; set; }

        [Display(Name = "Creation Date")]
        public DateTime? CreationDate { get; set; }

        [Display(Name = "Last Updated")]
        public DateTime? UpdateDate { get; set; }
    }
}

备注型号:

namespace NoteBlocks.Models
{
    public class NotesInList
    {
        public int Id { get; set; }

        [Required]
        [Display(Name = "List Name")]
        public string ListName { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "Creation Date")]
        public DateTime? CreationDate { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "Last Updated")]
        public DateTime? UpdateDate { get; set; }

        public string customFile { get; set; }

        [Display(Name = "Enter Note Content")]
        public string TextDescription { get; set; }

        public Lists List { get; set; }
        public int listID { get; set; }
    }
}

注释视图模型:

namespace NoteBlocks.Models
{
    public class NoteTagViewModel
    {
        public int NoteId { get; set; }
        [Required]
        [Display(Name = "List Name")]
        public string ListName { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "Creation Date")]
        public DateTime? CreationDate { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "Last Updated")]
        public DateTime? UpdateDate { get; set; }

        public string customFile { get; set; }

        [Display(Name = "Enter Note Content")]
        public string TextDescription { get; set; }

        //multiple tags
        public string TagsList { get; set; }

        public Lists List { get; set; }

        public int ListId { get; set; }
    }
}

创建了一个外键,但它不起作用。

HTML - 列表索引

@model IEnumerable<NoteBlocks.Models.Lists>

@{
    ViewBag.Title = "List";
    //ViewBag.Id = model.Lists.Id;
}

<h2>List</h2>

<p>
    @Html.ActionLink("  Create New List", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ListName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CreationDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UpdateDate)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                //using ActionLink to open list of notes for that particular List
                //and passing particular List ID from here if already created
                @Html.ActionLink(item.ListName, "Index", "NotesInLists", new { id = item.Id }, null)
                @*@TempData.Peek("tempDataId")*@
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreationDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UpdateDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
                @Html.ActionLink("Details", "Details", new { id=item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.Id })
            </td>
        </tr>
     }
</table>

HTML - 创建列表

@model NoteBlocks.Models.Lists

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
<div class="form-horizontal">
    <h4>List</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @Html.LabelFor(model => model.ListName, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.ListName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.ListName, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CreationDate, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.CreationDate, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.CreationDate, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.UpdateDate, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.UpdateDate, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.UpdateDate, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

HTML - 笔记索引

@model IEnumerable<NoteBlocks.Models.NotesInList>

@{
    ViewBag.Title = "List Notes";
}

<h2>List Notes</h2>

<p id="buttonsInPTag">
    <button type="button" class="btn btn-primary" id="addButton1"><span class="glyphicon glyphicon-plus">@Html.ActionLink("  Create Textual Note", "CreateWithtext")</span></button>
    <button type="button" class="btn btn-primary" id="addButton2"><span class="glyphicon glyphicon-plus">@Html.ActionLink("  Create Note from Document", "CreateWithDoc")</span></button>
    <button type="button" class="btn btn-primary" id="addButton3"><span class="glyphicon glyphicon-plus">@Html.ActionLink("  Create Image Note", "CreateWithImage")</span></button>
    <button type="button" class="btn btn-primary" id="addButton4"><span class="glyphicon glyphicon-plus">@Html.ActionLink("  Create Audio / Video Note", "CreateWithMedia")</span></button>
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ListName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CreationDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UpdateDate)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.ListName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreationDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UpdateDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }
</table>

HTML - 注释 CreateWithText

@model NoteBlocks.Models.NoteTagViewModel

@{
    ViewBag.Title = "Create Note with Text";
}

<h2>Create Note with Text</h2>

@using (Html.BeginForm("CreateWithText", "NotesInLists", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.ListName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ListName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ListName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.TextDescription, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <textarea cols="50" rows="12" class=form-control id="TextDescription" name="TextDescription"></textarea>
                @Html.ValidationMessageFor(model => model.TextDescription, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.Label("Tags", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <input type="text" id="tagsField" name="tagsField" class=form-control data-role="tagsinput" />
                <input type="hidden" name="TagsList" id="TagsList" />
            </div>
        </div>


        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section scripts
{
    <script>
        $(document.body).on('focusout', '.bootstrap-tagsinput input', () => {
        let array = $('#tagsField').tagsinput('items');
        $("#TagsList").val(array);
      })
    </script>
}

我坚持到这一点。请指导。 p.s。使用代码优先方法。

在您的笔记控制器的索引操作中,没有过滤器应用于获取笔记的查询。

我想添加 where 方法;

.Where(x=>x.listID == id)

将解决您的问题。

//Index
public ActionResult Index(int? id)
{
   TempData["idFromView"] = id;
   return View(db.NotesInLists/*.Where(x=>x.listID == id)*/.ToList());
}