我刚开始学习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);
}
}
添加ViewModel
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行动。
当我尝试访问a
和b
的值时,我得到的是空值,而不是输入到文本框中的值。
我不确定我哪里出错了。请帮忙。
答案 0 :(得分:6)
您的视图模型应如下所示
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);
}
修改强>
视图模型用于渲染您的视图不会在其中放置任何逻辑。如果你有更复杂的模型,那么很难将Model
映射到ViewModel
。为此,您可以使用AutoMapper或ValueInjector在模型和视图模型之间进行映射。
指向automapper http://automapper.codeplex.com/
的链接 值p <{3}} 的链接
希望这会有所帮助
答案 1 :(得分:5)
您不应在视图模型中使用域(业务)实体。如果这样做,视图模型就没用了,因为它仍然包含您在视图中可能不需要的业务逻辑。您的示例中的模型并不真正代表真实场景,无论如何都不需要视图模型。
视图模型的一个更常见和简单的示例是登录表单:您可能有一个名为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; }
}
上面的视图模型只包含登录表单所需的属性,并且拥有自己的数据注释。这有助于您清晰地分离视图逻辑和业务/数据逻辑。