【问题标题】:How to use ViewModels in ASP.NET MVC?如何在 ASP.NET MVC 中使用 ViewModel?
【发布时间】:2013-12-17 21:22:24
【问题描述】:

我刚开始学习 ASP.NET MVC 中的 ViewModel。所以,我想实现一个示例如下:

商业实体

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>
}

这里的问题是,每当单击Add 按钮时,我都无法检索输入到文本框中的值;对应的AJAX动作就是它了。

当我尝试访问 ab 的值时,我得到的是空值,而不是输入到文本框中的值。

我不确定我哪里出错了。请帮忙。

【问题讨论】:

  • 您看到表单集合中的预期值了吗?我不太确定,但是自从您进行 AJAX 回发以来,我相信您的模型在您进行回发时正在被序列化。控制器可能不再将其识别为视图模型,而是将其视为已发布值的集合。但同样,我不确定这是怎么回事..
  • @Rob..是的,我可以看到表单集合中的值
  • 一般来说,将模型包含在 ViewModel 中并不是一个好主意。
  • @haim770..我同意你的看法..但是有什么替代方法..

标签: c# asp.net-mvc viewmodel asp.net-mvc-viewmodel


【解决方案1】:

你的视图模型应该是这样的

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>

在控制器中

        [HttpPost]
        public JsonResult Add(AddViewModel model)
        {
            int iSum = model.a + model.b;
            model.Total = iSum;
            return Json(model);

        }

编辑

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

自动映射器链接http://automapper.codeplex.com/

价值注入器链接http://valueinjecter.codeplex.com/

希望对你有帮助

【讨论】:

  • @Anto..如果你在域模型中有 20 个字段..我想要所有这些字段以及其他 5 个字段..
【解决方案2】:

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

视图模型的一个更常见和微不足道的示例是登录表单:您可能有一个名为 User 的域模型,并且您希望他们登录。User 域模型可以很大,也可以只是很小的一部分它是身份验证所必需的。它还包含数据库的验证逻辑,它不代表登录表单的验证逻辑。

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; }
}

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

【讨论】:

  • ..感谢您的解释。但是,如果我的域模型包含 20 个字段并且我需要另外 2 个字段怎么办。做,我需要将所有那些已经存在于域模型中的视图模型中的字段..
  • @Henk..在我的示例中,如果我们不想在将结果发送回视图时创建匿名对象(示例 - 我的场景中的总计),则可能需要视图模型
  • @Avinash 是的,有时视图模型是域模型的副本,但通常它们包含其他验证属性并包含显示名称的数据注释等。我的个人经验是,我在使用时总是遇到麻烦我认为的领域模型。
  • @Avinash 具有与您的示例一样简单的域模型,您可以直接在您的视图中使用它。换句话说:这不是练习视图模型和理解为什么需要它们的好测试用例。
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多