Asp.net mvc 初始化视图模型
例如,我将展示的所有代码。 我有一个模型Asp.net mvc 初始化视图模型,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,例如,我将展示的所有代码。 我有一个模型 public class ViewModel { public User SomeUser { get; set; } public ViewModel() { } public ViewModel(int id) { SomeUser = someservice.getUserById(id); } } 我有控制器 public partial class SomeCo
public class ViewModel
{
public User SomeUser { get; set; }
public ViewModel()
{
}
public ViewModel(int id)
{
SomeUser = someservice.getUserById(id);
}
}
我有控制器
public partial class SomeController
{
public ActionResult Edit(int id)
{
var model = new ViewModel(id);
return View("Documents/Edit", model);
}
[HttpPost]
public ActionResult Edit(ViewModelmodel model)
{
if (ModelState.IsValid)
{
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = model.Id });
}
return View("someview", model);
}
}
视图中有窗体,视图中有显示
<b>Model.SomeUser.Name</b>
Model.SomeUser.Name
当我转到viemodel中的SomeController/Edit/3.someUser属性在构造函数中初始化时。但是当我在没有参数的情况下发回我的viewmodel初始化构造函数时,如果modelstate无效,someUser属性为null。因此我得到null引用异常。
处理这种情况的最佳方法是什么?这完全取决于您的需求 对于问题中的代码,您可以重用GET方法:
[HttpPost]
public ActionResult Edit(int id, ViewModelmodel model)
{
if ( !ModelState.IsValid ) return Edit( id );
...
这完全取决于你的要求 对于问题中的代码,您可以重用GET方法:
[HttpPost]
public ActionResult Edit(int id, ViewModelmodel model)
{
if ( !ModelState.IsValid ) return Edit( id );
...
您的
ViewModel
不应该真正负责调用服务,它应该只是在视图中显示内容的简单表示。我会保持简单
public class ViewModel
{
public User SomeUser { get; set; }
}
因此,您的常规编辑操作可以从您的服务初始化SomeUser属性
public ActionResult Edit(int id)
{
var model = new ViewModel()
{
SomeUser = someservice.getUserById(id);
};
return View("Documents/Edit", model);
}
现在开始发帖。提交表单时,id
应该仍然在查询字符串中,因此您可以在操作的参数以及保存表单数据的模型中绑定到它
[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
if (ModelState.IsValid)
{
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = id });
}
return View("someview", model);
}
现在,我可以确定您的视图
是什么样子,但实际上,您的视图模型
不包含任何可以提交和绑定的属性。这是一个编辑用户页面,您可能在一个表示您正在编辑的内容的ViewModel
之后
public class ViewModel
{
public string Username { get; set; }
public int Age { get; set; }
}
public ActionResult Edit(int id)
{
var user = someService.getUserById(id)
var model = new ViewModel()
{
Username = user.Username,
Age = user.Age
};
return View("Documents/Edit", model);
}
现在如果您在表单中使用Html帮助程序
@Html.TextBoxFor(m => m.Username)
@Html.TextBoxFor(m => m.Age)
。。。然后,您的属性将在post操作中自动绑定
[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
if (ModelState.IsValid)
{
var user = someService.getUserById(id);
user.Username = model.Username;
user.Age = model.Age;
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = id });
}
return View("someview", model);
}
您的ViewModel
不应该真正负责调用服务,它应该只是在视图中显示内容的简单表示。我会保持简单
public class ViewModel
{
public User SomeUser { get; set; }
}
因此,您的常规编辑操作可以从您的服务初始化SomeUser属性
public ActionResult Edit(int id)
{
var model = new ViewModel()
{
SomeUser = someservice.getUserById(id);
};
return View("Documents/Edit", model);
}
现在开始发帖。提交表单时,id
应该仍然在查询字符串中,因此您可以在操作的参数以及保存表单数据的模型中绑定到它
[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
if (ModelState.IsValid)
{
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = id });
}
return View("someview", model);
}
现在,我可以确定您的视图
是什么样子,但实际上,您的视图模型
不包含任何可以提交和绑定的属性。这是一个编辑用户页面,您可能在一个表示您正在编辑的内容的ViewModel
之后
public class ViewModel
{
public string Username { get; set; }
public int Age { get; set; }
}
public ActionResult Edit(int id)
{
var user = someService.getUserById(id)
var model = new ViewModel()
{
Username = user.Username,
Age = user.Age
};
return View("Documents/Edit", model);
}
现在如果您在表单中使用Html帮助程序
@Html.TextBoxFor(m => m.Username)
@Html.TextBoxFor(m => m.Age)
。。。然后,您的属性将在post操作中自动绑定
[HttpPost]
public ActionResult Edit(int id, ViewModel model)
{
if (ModelState.IsValid)
{
var user = someService.getUserById(id);
user.Username = model.Username;
user.Age = model.Age;
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = id });
}
return View("someview", model);
}
应该更详细地描述这个问题。你用什么图案
1) 如果是MVC(由于SomeController类和ActionResult),则:
这应该行得通
2) 如果是MVVM(因为ViewModel),则可以使用MVVMlight,它可以通过以下消息帮助您:
//从您的ModelView发送:
Messenger.Default.Send(“Hello world”);
//在另一个ModelView中添加以下内容:
Messenger.Default.Register<string>(this, DoSomething);
但是在这里我遇到了Galasoft…Win8.dll的问题,应该用更多的细节来描述这个问题。你用什么图案
1) 如果是MVC(由于SomeController类和ActionResult),则:
这应该行得通
2) 如果是MVVM(因为ViewModel),则可以使用MVVMlight,它可以通过以下消息帮助您:
//从您的ModelView发送:
Messenger.Default.Send(“Hello world”);
//在另一个ModelView中添加以下内容:
Messenger.Default.Register<string>(this, DoSomething);
但是在这里我遇到了Galasoft…Win8.dll的问题