Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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中使用ViewModels?_C#_Asp.net Mvc_Viewmodel_Asp.net Mvc Viewmodel - Fatal编程技术网

C# 如何在ASP.NET MVC中使用ViewModels?

C# 如何在ASP.NET MVC中使用ViewModels?,c#,asp.net-mvc,viewmodel,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Viewmodel,Asp.net Mvc Viewmodel,我刚刚开始学习ASP.NET MVC中的ViewModels。因此,我考虑实现一个示例,如下所示: 企业实体 public class AddModel { public int a { get; set; } public int b { get; set; } public int Add() { return (this.a + this.b); } } 添加视图模型 public class AddViewModel {

我刚刚开始学习ASP.NET MVC中的ViewModels。因此,我考虑实现一个示例,如下所示:

企业实体

public class AddModel
{
    public int a { get; set; }
    public int b { get; set; }

    public int Add()
    {
        return (this.a + this.b);
    }
}
添加视图模型

public class AddViewModel
{
    public AddModel addModel;
    public int Total { get; set; }
}
控制器

public class AddController : Controller
{
    [HttpPost]
    public JsonResult Add(AddViewModel model)
    {

        int iSum = model.addModel.a + model.addModel.b;
        model.Total = iSum;
        return Json(model);

    }

    public ActionResult Index()
    {
        return View();
    }
}
查看实施情况

@model ViewModelApplication.AddViewModel
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
<script src="../../Scripts/MicrosoftMvcAjax.debug.js" type="text/javascript"></script>
<script type="text/javascript">
    function Callback(data) {
        alert("I am sucess call");
    }

    function Failed() {
        alert("I am a failure call");
    }
</script>

@using (Ajax.BeginForm("Add", "Add", new AjaxOptions { OnSuccess = "Callback", OnFailure = "Failed" }))
{
    <table align="center">
        <tr>
            <td class="tdCol1Align">
                <label>
                    Number1</label>
            </td>
            <td class="tdCol2Align">
                @Html.TextBoxFor(Model => Model.addModel.a)
            </td>
        </tr>
        <tr>
            <td class="tdCol1Align">
                <label>
                    Number2</label>
            </td>
            <td class="tdCol2Align">
                @Html.TextBoxFor(Model => Model.addModel.b)
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="Add" class="button" />
            </td>
        </tr>
    </table>
}
@model viewmodel应用程序.AddViewModel
函数回调(数据){
警惕(“我成功呼叫”);
}
函数失败(){
警惕(“我是一个失败的电话”);
}
@使用(Ajax.BeginForm(“添加”、“添加”、新的AjaxOptions{OnSuccess=“Callback”、OnFailure=“Failed”}))
{
第一
@Html.TextBoxFor(Model=>Model.addModel.a)
2号
@Html.TextBoxFor(Model=>Model.addModel.b)
}
这里的问题是,每当单击
Add
按钮时,我无法检索输入到文本框中的值;相应的AJAX操作就是它

当我试图访问
a
b
的值时,我得到的是空值,而不是输入到文本框中的值


我不确定我会错在哪里。请提供帮助。

您不应该在视图模型中使用域(业务)实体。如果您这样做了,视图模型是非常无用的,因为它仍然包含您可能不希望出现在视图中的业务逻辑。您的示例中的模型并不真正代表现实世界中的场景,它实际上并不需要视图模型

视图模型的一个更常见、更简单的例子是登录表单:您可能有一个名为
User
的域模型,您希望他们登录。
用户
域模型可能很大,认证只需要其中的一小部分。它还包含数据库的验证逻辑,它不代表登录表单的验证逻辑

用户
域模型:

public class User
{
    [Required]
    public string UserName { get; set; }

    [Required]
    [MaxLength(36)] // The password is hashed so it won't be bigger than 36 chars.
    public string Password { get; set; }

    public string FullName { get; set; }

    public string SalesRepresentative { get; set; }

    // etc..
}
上面的域模型表示数据库表,因此包含验证逻辑以确保完整性

public class LoginModel
{
    [Display(Name = "User Name")]
    [Required(ErrorMessage = "Please fill in your user name.")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Please fill in your password.")]
    public string Password { get; set; }

    public bool RememberMe { get; set; }
}

上面的视图模型只包含登录表单所需的属性,并且有自己的数据注释。这有助于清晰地分离视图逻辑和业务/数据逻辑。

您的视图模型应该如下所示

public class AddViewModel
    {
        public int a { get; set; }
        public int b { get; set; }
        public int Total { get; set; }
    }

在cshtml中

            <td class="tdCol2Align">
                @Html.TextBoxFor(m=> m.a)
            </td>

            <td class="tdCol2Align">
                @Html.TextBoxFor(m=> m.b)
            </td>
编辑

视图模型是用来渲染视图的,不要在其中放置任何逻辑。如果您有更复杂的模型,则很难使用
ViewModel
映射
model
。为此,您可以使用AutoMapper或ValueInjector在模型和视图模型之间进行映射

自动制图器链接

值注入器的链接


希望这有帮助

您是否在表单集合中看到预期值?我不太确定,但由于您进行了AJAX回发,我相信在进行回发时,您的模型正在被序列化。控制器可能不再将其识别为viewmodel,而是将其视为已发布值的集合。但是,我也不确定这是怎么回事。@Rob。。是的,我可以看到表单集合中的值。一般来说,将模型作为ViewModel的一部分包含在表单集合中不是一个好主意。@haim770。。我同意你的看法。。但是,还有什么替代方法呢。……谢谢你的解释。但是,如果我的域模型包含20个字段,而我还需要另外两个字段呢。是的,我需要在视图模型中放入域模型中已经存在的所有字段。@Henk..在我的示例中,如果我们不想在将结果发送回视图时创建匿名对象,则可能需要视图模型(在我的场景中为示例-总计)@Avinash是的,有时视图模型是域模型的副本,具有,但通常它们包含其他验证属性,并包含显示名称等的数据批注。我个人的经验是,在我的视图中使用域模型时,我总是遇到麻烦。@Avinash对于像您的示例中那样简单的域模型,您可以在视图中直接使用它。换句话说:对于练习视图模型和理解为什么需要它们来说,这不是一个好的测试用例。@Anto..如果你在域模型中有20个字段..我想要所有字段和5个其他字段。。
        [HttpPost]
        public JsonResult Add(AddViewModel model)
        {
            int iSum = model.a + model.b;
            model.Total = iSum;
            return Json(model);

        }