1

編集ビューの一部として次のものがあります:-

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Rack.RackID)
@Html.HiddenFor(model => model.Resource.RESOURCEID)
@Html.HiddenFor(model => model.Rack.timestamp)
@Html.HiddenFor(model=>model.Rack.Technology)
<span class="f"> @Html.TextBoxFor(model => model.Rack.Technology.Tag, new 
{ @readonly = "readonly" })</span>
 <span class="f">Rack Name </span> 


@Html.EditorFor(model => model.Resource.RESOURCENAME)

             @Html.ValidationMessageFor(model => model.Resource.RESOURCENAME)                                              
</div>

<div >
<span class="f">Product Name </span> 

    @Html.DropDownList("productName", ((IEnumerable<TMS.Models.ComponentDefinition>)ViewBag.Products).Select(option => new SelectListItem {
        Text = (option == null ? "None" : option.COMPONENTNAME), 
        Value = option.COMPONENTNAME.ToString(),
        Selected = (Model != null) && (Model.Resource.ComponentDefinition !=   null ) && (option.COMPONENTNAME == Model.Resource.ComponentDefinition.COMPONENTNAME)
    }), "Choose...")
    @Html.ValidationMessageFor(model => model.Resource.COMPONENTID)
</div>


   <input type="submit" value="Save" class="btn btn-primary"/>
    }</div>

私は次のポスト編集アクションメソッドを持っています:-

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(RackJoin rj,FormCollection formValues)
        {
            string controllername = RouteData.Values["controller"].ToString();
            try
            {
                if (ModelState.IsValid)
                {
                    var message = "";
                    var status = "";
                    long assetid = new long();
                    XmlDocument doc = new XmlDocument();
                    using (var client = new WebClient())
                    {    var query = HttpUtility.ParseQueryString(string.Empty);
                        foreach (string key in formValues)
                        {
                            query[key] = this.Request.Form[key];
                        }

RackJoin モデル クラスは次のとおりです。

public class RackJoin
    {
        public Rack Rack { get; set; }
        public Resource Resource { get; set; }}

しかし、私が直面している問題は、オブジェクトを Post Edit アクション メソッドにポストバックすると、 (Rack.Technology, Rack.SiteDefinistion) などのすべてのナビゲーション プロパティが失われるため、すべてのオブジェクト ナビゲーション プロパティを維持する方法です。したがって、Post edit アクション メソッドがこれらのナビゲーション プロパティにアクセスする場合、またはモデル状態エラーの後に編集ビューがレンダリングされる場合、null 参照例外は発生しません。

4

1 に答える 1

2

これが機能しない理由Technologyは、 が複雑なタイプであるため、 を介してレンダリングできないためHiddenForです。このプロパティのすべての情報を保持する必要がある場合は、各プロパティを個別にレンダリングする必要があります。

@Html.HiddenFor(model => model.Rack.Technology.Name)

ただし、ここであなたのデザインに疑問を呈し始めています。多くの情報がこの特定のビューに無関係である場合、実際にはそこにあるべきではありません。ビューモデルはビューに合わせて調整する必要があるため、関連情報のみをキャプチャするように設計された特定のモデルを用意することをお勧めします。

public class RackJoinViewModel
{
    public int RackID { get; set; }
    public int ResourceID { get; set; }
    public DateTime TimeStamp { get; set; }
    public string Technology { get; set; }
    ...
}

複雑なタイプがないため、これによりビューのレンダリングが簡素化されます。

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.RackID)
    @Html.HiddenFor(model => model.ResourceID)
    @Html.HiddenFor(model => model.TimeStamp)
    @Html.HiddenFor(model => model.Technology)
    ...
}

これはよりクリーンであるだけでなく、リクエスト全体で無関係な情報を保持しようとする問題を根絶します。

于 2013-08-06T09:16:37.730 に答える