当模型中存在一对多关系时,MVC"创建视图"

Jan*_*ana 3 asp.net-mvc-4 entity-framework-5

我的模型很简单,一个客户端可以有很多电话号码:

我在实体框架中代表了这一点

生成的客户端类如下.

public partial class Client
{
    public Client()
    {
        this.PhoneNumbers = new HashSet<PhoneNumber>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我需要为"创建客户端"创建一个视图页面.此页面还应有空间输入PhoneNumbers(例如:默认情况下应该有两个文本框输入电话号码)

<fieldset>
    <legend>Client</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
Run Code Online (Sandbox Code Playgroud)

作为上面的"创建视图",我们可以轻松地为"model.Name"提供空间,因为它是一个简单的属性.但是我怎么能做类似的电话号码收集.. ??

我知道我们可以用丑陋的javascript代码实现这一点,但我想知道最简单易用的方法,我们可以使用ASP.NET MVC ......?

SOf*_*tic 6

你必须做一些事情:

首先创建一个ViewModel具有您需要的属性:

public class ClientViewModel
{
   public int Id {get;set;}
   public string Name {get;set;}
   public PhoneNumber PhoneNumber1 {get;set;}
   public PhoneNumber PhoneNumber2 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

改变Create返回ClientViewModel

[HttpGet]
public ActionResult Create()
{
   return View(new ClientViewModel());
}
Run Code Online (Sandbox Code Playgroud)

映射HttpPost以使用ClientViewModel并将值映射到它:

[HttpPost]
public ActionResult Create(ClientViewModel clientViewModel)
{
   var client = new Client();
   client.Name = clientViewModel.Name;
   client.PhoneNumbers.Add(clientViewModel.PhoneNumber1);
   client.PhoneNumbers.Add(clientViewModel.PhoneNumber2);
   db.Clients.Add(client);
   db.SaveChanges();
   return RedirectToAction("Index", "Client");
}
Run Code Online (Sandbox Code Playgroud)

然后,最后,修改您的视图:

<fieldset>
   <legend>Client</legend>

   <div class="editor-label">
      @Html.LabelFor(model => model.Name)
   </div>
   <div class="editor-field">
      @Html.EditorFor(model => model.Name)
      @Html.ValidationMessageFor(model => model.Name)
   </div>

   <div class="editor-label">
      @Html.LabelFor(model => model.PhoneNumber1.Number)
   </div>
   <div class="editor-field">
      @Html.EditorFor(model => model.PhoneNumber1.Number)
      @Html.ValidationMessageFor(model => model.PhoneNumber1.Number)
   </div>

   <div class="editor-label">
      @Html.LabelFor(model => model.PhoneNumber2.Number)
   </div>
   <div class="editor-field">
      @Html.EditorFor(model => model.PhoneNumber2.Number)
      @Html.ValidationMessageFor(model => model.PhoneNumber2.Number)
   </div>

   <p>
      <input type="submit" value="Create" />
   </p>
</fieldset>
Run Code Online (Sandbox Code Playgroud)