0

在 MVC 应用程序中,我有一些 DropDownLists。在我的控制器中,我创建了IEnumerable<SelectListItem>s 并将它们传输到我的视图。不幸的是,如果出现验证错误,我需要重新创建这些列表,否则视图渲染会失败。

在我正在做的控制器操作方法中:

var possibilities = _repo.Objects.Select(o=>new SelectListItem(...));
viewmodel.Possibilities = possibilities;
return View(viewmodel); 

视图模型的 Possibilities 属性定义如下:

IEnumerable<SelectListItem> Possibilities { get; set; }

在我看来,我访问它:

@Html.DropDownListFor(vm=>vm.ThePossibility, vm.Possibilities)

问题是当表单发布操作方法被调用时,传递给它的视图模型有一个 null for Possibilities,所以当我调用时:

if(!ModelState.IsValid)
    return View(model);

视图不会被渲染。

我理解为什么 post 操作方法的属性为空,但纠正这个问题的最佳方法是什么?我宁愿不重新初始化这些列表。

谢谢。

4

4 回答 4

1

如果您不想重新初始化列表,则必须将它们缓存在某个地方,例如会话或其他地方。

坦率地说,在大多数情况下,重建它们更简单。您每次都必须重新分配它们。

于 2012-10-02T20:58:01.580 回答
1

您应该考虑使用Post-Redirect-Get 模式这篇博文中描述了一对很好的属性,这使得在 ASP.Net MVC 中很容易做到这一点。

于 2012-10-02T21:02:33.203 回答
1

我通常将这些缓存在某处或提供一个静态类来获取常用列表。然后,您可以使用 getter 在您的模型中提供对这些的访问。

例如:

IEnumerable<SelectListItem> _possibilities 
IEnumerable<SelectListItem> Possibilities 
{ 
   get
   {
       if (_possibilities == null)
           _possibilities = CommonLists.Possibilities();

       return possibilities;
   }
}
于 2012-10-02T21:04:18.007 回答
0

访问器和 JSON ( NetwonSoft ) 是您的朋友。

简而言之

  1. 当您获得模型setIEnumerable<SelectListItem>属性时,将其序列化为公共字符串属性。
  2. 当您的公共字符串属性是set且未IEnumerable<SelectListItem>定义(例如 null)时,将字符串属性反序列化为IEnumerable<SelectListItem>模型的属性。
  3. 在您看来,嵌入序列化的字符串,以便它在发送到服务器的帖子之间保持不变。(例如@Html.HiddenFor(...)

模型

public class MyViewModel
{
    public IEnumerable<SelectListItem> Selections
    {
        get
        {
            return selections;
        }
        set
        {
            selections= value;
            // serialize SelectListItems to a json string
            SerializedSelections = Newtonsoft.Json.JsonConvert.SerializeObject(value);
        }
    }
    IEnumerable<SelectListItem> selections;

    public string SerializedSelections
    {
        get
        {
            return serializedSelections;
        }
        set
        {
            serializedSelections = value;
            if(Selections == null)
            {
                // SelectListItems aren't defined.  Deserialize the string to the list
                Selections = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<SelectListItem>>(value);
            }
        }
    }
    string serializedSelections;
}

剃刀视图

<form>
...
@Html.HiddenFor(m => m.SerializedSelections)
...
@Html.DropDownListFor(m => m.SomeProperty, Model.Selections)
</form>
于 2015-11-20T06:14:13.467 回答