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的问题