ASP NET MVC EF编辑导航属性

时间:2017-07-23 07:08:10

标签: c# asp.net-mvc entity-framework

目标试图创建我的第一个web asp net mvc应用程序,我一开始就遇到问题=(

我有一个db模型,很简单:

我有一个访客类:

public class Visitor {
    public int Id {get; set;}
    public int Name {get; set;}
    public int RequestId {get; set;}
    public virtual Request Request{get; set;}
}

请求类:

public class Request {
    public int Id {get; set;}
    public DateTime VisitDate {get; set;}
    public ICollection<Visitor> Visitors {get; set;}
}

我现在想要的就是能够以这样的形式创建和编辑请求,我可以在其中修改请求的访客导航属性。

在我的控制器中:

[HttpGet]
public ActionResult Edit(int id)
        {
            var request = db.Requests.Find(id);

            return View(request);
        }
[HttpPost]
    public ActionResult Edit(Request request, string[] visitors)
    {
        if (ModelState.IsValid)
        {
            db.Entry(request).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(request);
    }

string[] visitors参数是我的10000s试图找出我应该如何将Visitors集合传递给我的控制器。我尝试使用带有两个字段= RequestICollection<Visitor>的ViewModel - 没有任何帮助。访客在我的控制器中总是空着。

以下是我的观点:

<div class="form-horizontal">
        <h4>Request</h4>
        @Html.HiddenFor(model => model.Id)

        <div class="form-group">

            <label>Visitors</label>
            @foreach (var v in Model.Visitors)
            {

                @Html.HiddenFor(x =>v.Id)
                @Html.TextBoxFor(x => v.Name, new {@class="form-control", name = "visitors"})
            }

        </div>

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

            </div>
        </div>

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

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

是的,我知道"name=visitors"错了。我只是不能找到正确的方法来做到这一点。有人可以告诉我,我做错了什么吗?我只是想能够编辑请求的访问者,这是一个大问题还是什么? 感谢。

2 个答案:

答案 0 :(得分:1)

使用for循环而不是foreach:Model = Request View Model对象

@for (int i = 0; i < Model.Visitors.Count; i++)
{
      @Html.HiddenFor(m=>m.Visitors[i].Id)
      @Html.HiddenFor(m=>m.Visitors[i].RequestId)
      @Html.TextBoxFor(m => m.Visitors[i].Name)
}

使用包含访客对象列表的“请求”视图模型类。 (使用List而不是Icollection)。您可以将模型映射回数据库实体。

public class RequestViewModel
{
     public int Id { get; set; }
     public DateTime VisitDate { get; set; }
     public List<Visitor> Visitors { get; set; }
}

在你的行动方法中:

[HttpPost]
public ActionResult Edit(RequestViewModel request)
{
    // should get the request object with updated Visitors
    // Map the request view model to Request object along with visitors and update the Database enitiy.
}

答案 1 :(得分:0)

不要给两个不同的班级。一个类就可以了。记住访问者类和请求类。