を使用したメイン ビューがありViewModel
ます。内部でViewModel
私はこれを行います(完全に表示するように編集されていますViewModel
):
namespace MyNameSpace.ViewModels
{
public class MyViewModel
{
public ModelOne ModelOne { get; set; }
public ModelTwo ModelTwo { get; set; }
}
}
私のメインビューでこれを行います(編集:@Html.Hidden
コードを追加):
@using MyNameSpace.ViewModels
@using MyNameSpace.Models
@model MyViewModel
...
@using (Html.BeginFormAntiForgeryPost())
{
@Html.Hidden("myData", new MvcSerializer()
.Serialize(Model, SerializationMode.Signed))
....
<div>
@{Html.RenderPartial("_MyCheckBox",
Model.ModelTwo, new ViewDataDictionary());}
</div>
}
....
私の部分的な見解は次のとおりです。
@using MyNameSpace.Models
@model ModelTwo
<div>
<fieldset>
<div class="editor-label">
@Html.LabelFor(x => x.MyCheckBox)</div>
<div class="editor-field">
<select multiple="multiple" id="@Html.FieldIdFor(x =>
x.MyCheckBox)" name="@Html.FieldNameFor(x =>
x.MyCheckBox)">
@foreach (MyEnum item in Enum.GetValues(typeof(MyEnum)))
{
var selected = Model.MyCheckBox.Contains(item); //ERROR HERE
<option value="@((int)item)" @if (selected)
{<text>selected="selected"</text>}>
@T(item.ToString())
</option>
}
</select>
</div>
</fieldset>
</div>
エラーがObject reference not set to an instance ...
発生し、修正方法がわかりません。
もともと、<fieldset>
メインビュー内にそれがあり、そのエラーが発生していました。2つのモデルのせいだと思ったので、部分的に配置しました。しかし、私が同じ問題に直面していることを発見するだけです。
MyCheckBox
ラインの部分的なビューで をvar selected = Model.MyCheckBox.Contains(item);
正しく設定していません。
何かご意見は?
EDIT (MyCheckBox
コードの追加)
ModelOne.csMyCheckBox
の内部は次のとおりです。
[Mandatory(ErrorMessage = "Please select at least one option")]
[Display(Name = "Please select one ore more options")]
[MySelector]
public virtual int MyCheckBox { get; set; }
そして、ここではModelTwo.csの中にあります:
private IList<MyEnum> _myEnum;
public IList<MyEnum> MyCheckBox
{
get
{
if (_myEnum== null)
{
_myEnum= new List<MyEnum>();
foreach (MyEnumitem in Enum.GetValues(typeof(MyEnum)))
{
if (((MyEnum)Record.MyCheckBox& item) == item)
_myEnum.Add(item);
}
}
return _myEnum;
}
set
{
_myEnum= value;
Record.MyCheckBox= 0;
foreach (var item in value)
{
Record.MyCheckBox|= (int)item;
}
}
}
私はオーチャードを使用していることに注意してください(したがって、Record
)、次にNHibernateを使用します。私はそれが関連しているとは思わないが、間違っている可能性がある. MyCheckBox
コードはの[Flags]
属性を使用し、値をDBにenum
格納しています(したがってプロキシ)。int
は次のようにenum
なります。
MyEnum.cs :
[Flags]
public enum MyEnum
{
[Display(Name="Name 1")]
Enum1 = 1,
[Display(Name="Name 2")]
Enum2 = 2,
[Display(Name="Name 3")]
Enum3 = 4,
[Display(Name="Name 4")]
Enum4 = 8,
[Display(Name="Name 5")]
Enum5 = 16
}
MyController.cs
private MyViewModel myData;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var serialized = Request.Form["myData"];
if (serialized != null) //Form was posted containing serialized data
{
myData= (MyViewModel)new MvcSerializer().Deserialize
(serialized, SerializationMode.Signed);
TryUpdateModel(myData);
}
else
myData= (MyViewModel)TempData["myData"] ?? new MyViewModel();
TempData.Keep();
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Result is RedirectToRouteResult)
TempData["myData"] = myData;
}
次に、特定Action
の *MyController.cs 内で:
public ActionResult Step5(string backButton, string nextButton)
{
if (backButton != null)
return RedirectToAction("Step4");
else if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Confirm");
else
return View(myData);
}