Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC查看键/值对中的模型_C#_Asp.net Mvc 4_Razor - Fatal编程技术网

C# ASP.NET MVC查看键/值对中的模型

C# ASP.NET MVC查看键/值对中的模型,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,如何将键/值对表示为ASP.NET MVC模型?我的表单数据没有强类型模型的支持 我的第一个解决方案是使用Razor设计表单,并使用一些扩展方法来获取FormElement值 @model IEnumerable<FormElementKeyValues> @Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br /> 这将允许我在视图中使用强类型模型以及标准的Raz

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

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

@model IEnumerable<FormElementKeyValues>

@Html.TextBox(Model.GenerateID("Email"), Model.GetFormElementValue("Email"))<br />
这将允许我在视图中使用强类型模型以及标准的Razor Html帮助程序

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

@(Html.TextBoxFor(model=>model.Firstname))
@(Html.ValidationMessageFor(model=>model.Firstname))
@(Html.DisplayFor(model=>model.Firstname))

我想你已经把这项任务复杂化了

模型在那里,您可以从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; }
}
接下来,让我们想象一下,我们有一个
事件
控制器,其操作名为
寄存器

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>
}
@model RegistrationViewModel
@使用(Html.BeginForm(“注册”、“事件”)
{
@(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))
}

我是动态编写的,所以我不知道它是否会按原样编译,但我向您展示的基本上就是它的全部…

这当然是理想的解决方案。我假设您的数据库中有一个事件表,EventModel是该表的1:1表示形式。我的表单后面没有数据库模型m、 我有两个表FormElement和FormValue(我知道这是一个糟糕的设计,但它是2007年的遗留系统,每年处理500000个事务,所以我不能像那样改变它:()@flip虽然看起来这样的DB可能并不理想,但听起来您有一个完美的场景,可以将视图模型转换为数据模型。我知道直接从数据模型转换到视图是不错的,但有时您会情不自禁,比如在愚蠢的DB模式中(听起来像是tdwtf提交),或与服务交互。就我个人而言,我更喜欢使用视图模型,因为它将用户界面与数据库设计分离。@CodeMonkey1313事实上,我的第一个解决方案是一个可行的解决方案,直到我可以移动到一个完整的视图/模型体系结构。我上面介绍的不是您数据库的模型,而是一个
事件
 表,并且名字和姓氏将是
Customers
表的列,上面的
RegistrationViewModel
稍后将转换为我们的业务模式…使用POCO生成器创建您的域模型,因为您已经有了数据库
@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>
}