2013-07-12 26 views
4
许多关系

我的模型很简单,一个客户可以有多个电话号码:MVC“创建视图”时,有一个模型

我在实体框架所代表的本

生成的客户端类如下。

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; } 
} 

现在我需要为“创建客户端”创建一个视图页面。此页面应该有空间,也进入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> 

如上述的“创建视图”我们可以很容易地给出“model.Name的空间“,因为它是一个简单的属性。但我怎么能做一些类似的电话号码集合..?

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

回答

5

你要做的几件事情:

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

public class ClientViewModel 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public PhoneNumber PhoneNumber1 {get;set;} 
    public PhoneNumber PhoneNumber2 {get;set;} 
} 

变化Create返回ClientViewModel

[HttpGet] 
public ActionResult Create() 
{ 
    return View(new ClientViewModel()); 
} 

地图的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"); 
} 

然后,最后,修改你的观点:

<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> 
+0

这个解决方案给我带来了这样做的更好的方法。直到现在,我还不知道“查看模型”。非常感谢您提出这个解决方案。 –

+1

如果电话号码的数量不受限制? – chris

+1

@chris您可以为1个电话号码创建视图模型,然后为其创建编辑器模板。然后,通过使用一些js,动态地将编辑器模板添加到页面中,并将集合发布到控制器。 – SOfanatic

2

因为你可以使用类似这样的集合:

@for(int i = 0; i < Model.PhoneNumbers.Count; i++) 
{ 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.PhoneNumbers[i]) 
     @Html.ValidationMessageFor(model => model.PhoneNumbers[i]) 
    </div> 
} 
+0

假设你使用Client作为ViewModel,不幸的是你不能这么做。 – willDaBeast

+0

是的,您是对的,在这种情况下,OP需要另一个视图让Client VM使其与EditorFor正常工作 –

相关问题