0

私が作成しようとしているのは、モデルのプロパティが表示されるビューと、1 つのプロパティ (この場合はヘルパーを作成した「ステータス」) を変更するオプションです。

変更されたプロパティが正しく変更され、変更されたところまで来ましたが、どういうわけか他のプロパティの値がリセットされています。

これは、投稿データがモデルの変更に使用されているためであり、一部のプロパティは変更できないため、モデルの更新に空の値が使用されているためだと思いますか?

ここに私のコントローラGETがあります:

public ActionResult Edit(int id = 0)
    {
        ProductCode productcode = db.ProductCodes.Find(id);
        if (productcode == null)
        {
            return HttpNotFound();
        }
        return View(productcode);
    }

そしてここに投稿:

[HttpPost]
    public ActionResult Edit(ProductCode productcode)
    {
        if (ModelState.IsValid)
        {
            db.Entry(productcode).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(productcode);
    }

そして最後にビュー:

@model PortalTMC.Models.ProductCode

@{
     ViewBag.Title = "Change status";
}

<h2>Status veranderen</h2>
<br />

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
         <legend>ProductCode</legend>

        @Html.HiddenFor(model => model.Id)


        @Html.LabelFor(model => model.Id, "Id")
        @Html.DisplayFor(m => m.Id)
        @Html.LabelFor(model => model.Code, "Product code")
        @Html.DisplayFor(m => m.Code)
        @Html.LabelFor(model => model.Role, "Rol  (1 = Administrator  |  2 = Trainer  |  3 = User)")
        @Html.DisplayFor(m => m.Role)
        <div class="editor-label">
            @Html.LabelFor(model => model.Status, "Status")
        </div>
        <div class="editor-field">
            @Html.EnumDropDownListFor(model => model.Status)
        </div>
        <p>
        <input type="submit" value="Verander status" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Terug naar lijst", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

どんな助けでも大歓迎です

アップデート:

残念ながら、post メソッドのプロパティを含めたり除外したりすることはできません:/ たとえば、post メソッドを次のように置き換えた場合:

[AcceptVerbs(HttpVerbs.Post)]
    [HttpPost]
    public ActionResult Edit([Bind(Exclude = "Role, Code")] ProductCode productcode)
    {
        if (ModelState.IsValid)
        {
            db.Entry(productcode).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(productcode);
    }

私はまだ役割とコードがリセットされてしまいます..

商品コードは以下の通りです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace PortalTMC.Models
{
    public class ProductCode
    {
        //PK
        [Key]
        public int Id { get; set; }

        public string Code { get; set; }
        public ProductCodeStatus Status { get; set; }
        public int Role { get; set; }
    }

    public enum ProductCodeStatus
    {
        Active,
        Inactive,
        Pending,
    }
}
4

2 に答える 2

1

vtortola の提案は、エンティティをビューに直接公開するべきではないという非常に有効です。を使用した後でもエンティティの値がリセットされる理由のみを説明しますExcludeAttribute。実際、それらはリセットされていません。モデルバインダーは、デフォルト値が設定された新しいオブジェクトを作成し、リクエストからの値がオブジェクトに書き込まれます。ここで使用ExcludeAttributeしても効果はありません。これは、リクエスト パラメータから除外された値を単純に無視するためです。それでも、まだ新しいオブジェクトです(dbのオブジェクトではありません)。したがって、モデルにバインドされたオブジェクトに編集不可能な値を表示したい場合は、これらの値をリクエスト オブジェクトに提供する必要があります (隠しフィールドは 1 つのオプションです)。

UpdateModel2 番目のオプションは、バインドされたオブジェクトをメソッドから省略し、次のようなメソッドでモデル バインディングを明示的に呼び出すことです。

[AcceptVerbs(HttpVerbs.Post)]
    [HttpPost]
    public ActionResult Edit()
    {
        var code = db.GetCode();
        if (ModelState.IsValid)
        {

            UpdateModel(code, "Excluded properties as string seperated by comma");//plz check the correct overload of updatemodel
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    return View(code);
}
于 2012-12-05T15:13:41.097 に答える
0

ExcludeAttributeを使用してバインディングからプロパティを除外できます。

ただし、MVC を介してデータ エンティティを公開しないでください。ブラウザーとサーバー間の情報交換を表す入力/出力モデルを作成して、その情報をきめ細かく制御し、有効な場合はデータ エンティティを取得して値を適用します。

乾杯。

于 2012-12-05T12:38:56.930 に答える