MVC专题 专题
您的位置:csharp > MVC专题专题 > ASP.Net MVC模型绑定
ASP.Net MVC模型绑定
作者:--    发布时间:2019-11-19 12:36:48

asp.net mvc模型绑定允许您将http请求数据与模型进行映射。 这是使用http请求中的浏览器发送的数据创建.net对象的过程。对于asp.net mvc而言,asp.net web forms开发人员大多都感到困惑,因为视图的值在到达控制类的动作方法时会如何转换为model类,这个转换由模型绑定器完成。

模型绑定是http请求和 c# 操作方法之间的良好设计桥梁。 它使开发人员可以方便地使用表单(视图)上的数据,因为post和get会自动传输到指定的数据模型中。 asp.net mvc使用默认的绑定器来完成这个场景。

我们来看一个简单的例子,在上一章的项目中添加一个“创建视图”,我们将看到如何从视图中获取这些值传到employeecontroller动作方法。

以下是post的创建动作方法。

// post: employee/create
[httppost]
public actionresult create(formcollection collection){
   try{
      // todo: add insert logic here
      return redirecttoaction("index");
   }catch{
      return view();
   }
}

右键单击create动作方法,然后选择添加视图…, 它将显示添加视图对话框。
如在上面的屏幕截图中看到的那样,默认的动作名字已经在输入框中了。现在从“模板”下拉列表中选择“create”,从“模型”下拉列表中选择“employee”。参考下图 -

创建的create.cshtml 视图中看到默认代码如下 -

@model mvcsimpleapp.models.employee

@{
    layout = null;
}

<!doctype html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>create</title>
</head>
<body>
    @using (html.beginform()) 
    {
        @html.antiforgerytoken()

        <div class="form-horizontal">
            <h4>employee</h4>
            <hr />
            @html.validationsummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @html.labelfor(model => model.name, htmlattributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @html.editorfor(model => model.name, new { htmlattributes = new { @class = "form-control" } })
                    @html.validationmessagefor(model => model.name, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @html.labelfor(model => model.joiningdate, htmlattributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @html.editorfor(model => model.joiningdate, new { htmlattributes = new { @class = "form-control" } })
                    @html.validationmessagefor(model => model.joiningdate, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @html.labelfor(model => model.age, htmlattributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @html.editorfor(model => model.age, new { htmlattributes = new { @class = "form-control" } })
                    @html.validationmessagefor(model => model.age, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    <div>
        @html.actionlink("back to list", "index")
    </div>
</body>
</html>

当用户在创建视图上输入值时,它在formcollection和request.form中都可用。可以使用这些值中的任何一个来填充视图中的员工信息。

使用下面的代码来(formcollection)创建员工信息。参考以下代码 -

// post: employee/create
[httppost]
public actionresult create(formcollection collection){
   try {
      employee emp = new employee();
      emp.name = collection["name"];
      datetime jdate;
      datetime.tryparse(collection["dob"], out jdate);
      emp.joiningdate = jdate;
      string age = collection["age"];
      emp.age = int32.parse(age);
      emplist.add(emp);
      return redirecttoaction("index");
   }catch {
      return view();
   }
}

运行这个应用程序并请问这个url:http:// localhost:63004 / employee /。将收到以下输出结果 -

点击页面顶部的“create new”链接,它将转到下面的视图。如下所示 -

输入想要添加的其他员工的数据。如下所示 -

点击创建按钮,会看到新员工被添加到列表中。如下图所示 -

在上面的示例中,从html视图中获取所有发布的值,然后将这些值映射到employee属性并逐一分配它们。

在这种情况下,我们也将在发布的值与model属性的格式不相同的情况下进行类型转换。

这也被称为手动绑定,这种类型的实现对于简单和小数据模型可能不是那么糟糕。 但是,如果对于具有大量的数据类型的模型,则需要大量的类型转换,那么可以利用asp.net mvc model绑定的强大功能和易用性。

下面来看看为模型绑定所做的另一个例子。

我们需要改变create方法的参数来接受employee模型对象而不是formcollection对象,如下面的代码所示。

// post: employee/create
[httppost]
public actionresult create(employee emp){
   try{
      emplist.add(emp);
      return redirecttoaction("index");
   }catch{
      return view();
   }
}

现在,模型绑定的魔力取决于提供值的html变量的id。

对于employee模型,html输入字段的id应该与employee模型的属性名称相同,可以看到visual studio在创建视图时使用了相同的模型属性名称。如下代码 -

@html.editorfor(model => model.name, new { htmlattributes = new { @class = "form-control" } })

映射将基于默认的属性名称。在这里,您会发现html助手方法非常有用,因为这些助手方法将生成html,它将具有适当的名称以使模型绑定起作用。

运行修改代码的应用程序,与上面的运行结果一样。


网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册