1

例如,我将展示的所有代码。我有视图模型

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>

当我去 SomeController/Edit/3.In viemodel someUser 属性在构造函数中初始化。但是当我回发我的 viewmodel 初始化构造函数时没有参数并且如果模型状态无效,someUser 属性为空。所以我得到空引用异常。处理这种情况的最佳方法是什么?

4

3 回答 3

4

ViewModel不应该真正负责调用服务,它应该只是在您的View. 我会保持简单。

public class ViewModel
{
    public User SomeUser { get; set; }
}

因此,您的常规 Edit 操作可以从您的服务中初始化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);
}

现在,我现在确定你的View样子,但实际上,你的ViewModel不包含任何可以提交和绑定的属性。这是一个编辑用户页面,您可能会在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);
}
于 2013-04-02T10:01:38.197 回答
0

这完全取决于您的要求。

对于您问题中的代码,您可以重用您的 GET 方法:

[HttpPost]
public ActionResult Edit(int id, ViewModelmodel model)
{
  if ( !ModelState.IsValid ) return Edit( id );
  ...
于 2013-04-02T10:00:43.803 回答
0

应该更详细地描述问题。你用什么模式?

1)如果是 MVC(因为 SomeController 类和 ActionResult),那么:

[HttpPost]
public ActionResult Edit(int id, ViewModel model) {
if (ModelState.IsValid) {
TempData["Save"] = true;
return RedirectToAction("Edit", new { id = id });
}
return View("someview", model);
}

这应该有效。

2)如果是 MVVM(因为 ViewModel),那么你可以使用 MVVMlight,它可以通过消息帮助你:

//从你的模型视图发送:

Messenger.Default.Send(“Hello world”);

//在另一个模型视图中添加:

Messenger.Default.Register<string>(this, DoSomething);

// 更远

private void DoSomething(string message) {
// what to do with it...
}

但在这里我遇到了 Galasoft 的问题...Win8.dll

于 2013-04-02T14:06:22.327 回答