我应该如何使用这个简单的创建视图为我的ASP.NET MVC3视图编程这个控制器ActionResult方法?

时间:2011-10-08 06:48:39

标签: c# .net asp.net-mvc-3 controller

我不确定是否应该使用FormsCollection或其他内容,使用此基本Create视图。

(注意:我使用custom editor template作为标签ICollection<string>

模型

public class Question
{
    [Required, StringLength(100)]
    public string Title { get; set; }
    [Required]
    public string Body { get; set; }
    public ICollection<string> Tags { get; set; }
}

视图

@model AWing.Core.Entities.Product

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Question</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.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Description)
            @Html.ValidationMessageFor(model => model.Description)
        </div>

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

        <p>
            <input type="submit" value="Create a new product" />
        </p>
    </fieldset>
}

控制器

[HttpPost]
public ActionResult Create(FormsCollection formsCollection)
{
  ... ????
}

或其他什么?

[HttpPost]
public ActionResult Create(... ??? ...)
{
  .... ????
}

1 个答案:

答案 0 :(得分:4)

由于你有一个强类型的视图,你可以让你的[HttpPost]方法采用与变量相同的类型,例如:

[HttpPost]
public ActionResult Create(Product model)  
{  
    if (ModelState.IsValid)
    {
        // add new product
        .... ????
    } 
}  

DefaultModelBinder将获取返回的值,并将它们插入到强类型模型中。中提琴!

只要您的标签集合的模板模型是string类型,MVC就会遍历集合,以便绑定它(尽管您可能需要更改ICollection列表)。

<强>更新

正如我们在评论中所讨论的那样,不是每个标签创建一个文本框,而是创建一个单独的ViewModel,它具有您所有其他产品属性。<​​/ p>

不要在ViewModel中使用List<string> Tags,而是创建此属性:

public string TagCollection { get; set; }

在您的视图中,有TagCollection的文本框。然后,在“创建”操作中,您可以将TagCollection字符串解析为标记列表。