ASP.NET MVC从键/值对查看模型

时间:2014-06-28 21:20:05

标签: c# asp.net-mvc-4 razor

如何将键/值对表示为ASP.NET MVC模型?我的表单数据不受强类型模型的支持。

我的第一个解决方案是使用Razor设计我的表单并使用一些扩展方法来获取FormElement值。

@model IEnumerable<FormElementKeyValues>

@Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br />

这可行,但当我想处理来自POST的数据时,它会变得混乱。我没有模型,所以我被迫退回使用FormCollection,这意味着我失去了强类型模型和验证的好处。

第二个解决方案(我还没有尝试过这个)就是创建我个人的表单模型并用自定义属性装饰属性,这些属性可以帮助我访问键/值对。

public SimpleFormModel {

    [FormElement("Fullname")]
    [Required(ErrorMessage = "Required")]
    public string Fullname { get; set; }

    [FormElement("Email")]
    [Required(ErrorMessage = "Required")]
    [DisplayName("E-mail")]
    public string Email { get; set; }
}

public ComplexFormModel {

    [FormElement("Firstname")]
    [Required(ErrorMessage = "Required")]
    public string Firstname { get; set; }

    [FormElement("Surname")]
    [Required(ErrorMessage = "Required")]
    public string Surname { get; set; }

    [FormElement("Email")]
    [Required(ErrorMessage = "Required")]
    [DisplayName("E-mail")]
    public string Email { get; set; }
}

这样我就可以在视图中使用强类型模型以及标准的Razor Html助手。

<div class="editor-field">
  @(Html.TextBoxFor(model => model.Firstname))
  @(Html.ValidationMessageFor(model => model.Firstname))
  @(Html.DisplayFor(model => model.Firstname))
</div>

1 个答案:

答案 0 :(得分:1)

我认为你正在使这项任务复杂化......

您可以使用模型渲染,并使用Razor视图进行消费......

例如,假设我有一个销售节日门票的网站,我有一个订单,我希望可以在我销售门票的所有不同活动中重复使用,并且我希望预先填写名称这种形式的事件......这就是你要做的......

首先,你需要一个模型,

public class RegistrationViewModel {
    [Display(Name = "Event")]
    public string EventName { get; set; }

    [Required]
    [Display(Name = "First name")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Last name")]
    public string LastName { get; set; }
}

接下来让我们假设我们有一个名为Events

的动作的Register控制器
public class Events : Controller 
{
    public ActionResult Register(int id)
    {
        Event event = DbSource.FindEventById(id);

        RegistrationViewModel model = new RegistrationViewModel 
        {
            EventName = event.Name
        }

        return this.View(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegistrationViewModel model)
    {
        if( ! ModelState.IsValid ) 
        {
            return this.View(model);
        }

        // ship the tickets, return thank you view, etc...
    }
}

最后我们的观点......

@model RegistrationViewModel

@using (Html.BeginForm("Register", "Events")
{
    <div>
        @(Html.AntiForgeryToken())

        @(Html.LabelFor(model => model.EventName))
        @(Html.ValueFor(model => model.EventName))

        @(Html.LabelFor(model => model.FirstName))
        @(Html.TextBoxFor(model => model.FirstName))
        @(Html.ValidationMessageFor(model => model.FirstName))

        @(Html.LabelFor(model => model.LastName))
        @(Html.TextBoxFor(model => model.LastName))
        @(Html.ValidationMessageFor(model => model.LastName))
    </div>
}

我已经动态地写了这个,所以我不知道它是否会按原样编译,但是我已经向你展示的基本上就是它的所有内容......