0

私は2つのページを持っています:

  • データ注釈の検証を使用するページを作成します。
  • ページを編集します。

両方のページで異なるモデルを使用しています。選択した行の値を表示するには、編集ページに特定のモデルを使用する必要があります。方法:

  1. 同じ検証を使用するように編集コントローラーを取得する、または
  2. 作成ページと同じモデルを使用する場合、編集ページに現在の行の値を表示しますか?

例えば:

私の作成ページ:

@model Test.Models.NewPerson
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Failed. Please fix the errors.")

        <div class="editor-label">
            @Html.LabelFor(m => m.FirstName)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.FirstName)
            @Html.ValidationMessageFor(m => m.FirstName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(m => m.LastName)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.LastName)
            @Html.ValidationMessageFor(m => m.LastName)
        </div>
    <input type="submit" value="Submit" />
}

私のモデル:

public class NewPerson 
{
    [Required(ErrorMessage = "*")]
    [Display(Name = "First name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "*")]
    [Display(Name = "Last name")]
    public string LastName { get; set; }
}

次に、私の編集ページ:

@model Test.Person

using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Please fix the errors below.")

        <div class="editor-label">
            @Html.LabelFor(m => m.FirstName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.FirstName)
            @Html.ValidationMessageFor(m => m.FirstName)
        </div>
        <div class="editor-label">
            @Html.LabelFor(m => m.LastName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.LastName)
            @Html.ValidationMessageFor(m => m.LastName)
        </div>
    <input type="submit" value="Update" />
}

編集

私のコントローラーの編集アクションには、次のものがあります。

var context = new MyContext();          
var person = context.Person.Single(m => m.ID == id);

if (Request.IsAjaxRequest())
{
    return PartialView("Edit", person);
}
return View(person);

その関数にブレークポイントを設定すると、var person の結果が表示されます。ただし、ビューには何も返されません。なぜだめですか?

編集

アクションのコードは次のとおりです。

[HttpPost]

public ActionResult Create(NewPerson model)
{
if (ModelState.IsValid)
{
    string UID = Membership.GetUser().ProviderUserKey.ToString();
    System.Guid myUID = System.Guid.Parse(UID);

    using (var context = new MyContext())
    {   
       Person newPerson = new Person();
       newPerson.UserId = myUID;
       newPerson.FirstName = model.FirstName;
       newPerson.LastName = model.LastName;
       context.Person.AddObject(newPerson);
       context.SaveChanges();
    }
    }

編集アクション:

[HttpGet]

    public ActionResult Edit(int id)
    {
        var context = new MyContext();

        //recently edited: accidentally had "camper" instead of "person"
        var person = context.Person.Single(m => m.ID == id);

        if (Request.IsAjaxRequest())
        {
            return PartialView("Edit", person);
        }
        return View(person);

    }

そして私の見解:

@foreach (var person in Model)
{
@Html.DisplayFor(modelItem => person.LastName), @Html.DisplayFor(modelItem => person.FirstName)

@Html.ActionLink("Edit", "Edit", new { id = person.ID }, new { @class = "openDialog", 
    data_dialog_id = "emailDialog", data_dialog_title = "Edit Person" })
}
4

2 に答える 2

0

両方のビューで同じモデルを使用できます。これは、作成/編集関数の一般的な方法であり、同じ検証ルールを使用して問題1を解決します。

編集ビューの入力フィールドに既存のデータを表示するには、コントローラーでそのデータを取得してビューに渡す必要があります(つまり、モデルにデータを入力します)。

おそらく、編集時に、ある種のIDがあります。これを使用してデータソースから適切なレコードを取得し、モデルにFirstNameとLastNameの値を設定します。次に、ビューをレンダリングすると(もちろん、モデルを渡した後)、テキストボックスに既存の値が表示されます。

于 2012-09-19T16:04:51.503 に答える
0

ここでは、何を行って何を行っていないか、何が機能して何が機能しないかについて少し混乱しています。ただし、修正する必要があることがいくつかあります。

まず、データベースから取得した Person オブジェクトをビューに直接渡すべきではありません。代わりに、独自の Person ViewModel を用意する必要があります。この ViewModel には、ビューのデータ注釈が必要です。データベースから Person を取得したら、次のように ViewModel に投影します。

var camper = context.Person
    .Select(m => new ViewModel.Person
         { Firstname = m.Firstname, Lastname = m.Lastname}).Single(m => m.ID == id);

これにより、データ モデルの Person が View の要件によって肥大化するのを防ぎます (たとえば、データ モデルでは null が許可されているが、View を Required に設定したい場合など)。

次に、編集ビューで using ステートメントを使用していません。このようなもの:

using (var camper = ..) {
    ...
}

ViewModel を使用すると、変更が追跡されるエンティティと競合することなくコンテキストを破棄できるため、ここでも役立ちます。

3 番目に、おそらく DisplayTemplates をもう少し適切に使用する必要があります。ビューに foreach ステートメントを含めるのではなく、次のようにします。

@Html.DisplayForModel()

次に、Views\Shared (またはビューがあるフォルダー) に DisplayTemplates というフォルダーを作成し、Person.cshtml という名前の新しい .cshtml ファイルを作成します。その中に次のコードがあります。

@model Person
@Html.DisplayFor(m => m.LastName), @Html.DisplayFor(m => m.FirstName)

@Html.ActionLink("Edit", "Edit", new { id = person.ID }, new { @class = "openDialog", 
    data_dialog_id = "emailDialog", data_dialog_title = "Edit Person" })

また、名前空間にいくつかの不一致があることに気付きました。ある場所には Test.Person があり、別の場所には Test.Models.NewPerson があります。あなたも Test.Models.Person を持っていて、どれがどれなのか混乱していて、間違ったものを入力してしまう可能性はありますか?

于 2012-09-19T17:48:06.540 に答える