0

を使用したメイン ビューがあり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);
    }
4

0 に答える 0