0

LabelFors に値がありますが、ポストバックを行うと、モデルにはデフォルト値があります。

@using (Html.BeginForm("Delete", "Event", FormMethod.Post))
{
    <p>
        @Html.LabelFor(m => m.EventID, "Event ID")<br />
        @Html.LabelFor(m => m.EventID, Model.EventID.ToString())
    </p>
    <p>
        @Html.LabelFor(m => m.DayCode, "Type of Event")<br />
        @Html.LabelFor(m => m.DayCode, Model.DayCode.ToString())
    </p>
    <p>
        @Html.LabelFor(m => m.EventDate, "Date of Event")<br />
        @Html.LabelFor(m => m.EventDate, Model.EventDate.ToShortDateString())
    </p>
    <p>
        @Html.LabelFor(m => m.Subject, "Person or Interest")<br />
        @Html.LabelFor(m => m.Subject, Model.Subject)
    </p>
    <p>
        @Html.LabelFor(m => m.EventDesc, "Description")<br />
        @Html.LabelFor(m => m.EventDesc, Model.EventDesc)
    </p>

    <table>
        <tr>
            <td>
                @Html.ActionLink("Back", "Index", new { month = Model.EventDate.Month,
                                                        year = Model.EventDate.Year,
                                                        day = Model.EventDate.Day})
            </td>
            <td>            
                <input id="delete" type="submit" value="Submit Changes" />
            </td>
        </tr>
    </table>
}

        public ActionResult Delete(int eventID, int year, int month, int day)
        {
            //Find Event then return to Index
            EventModel thisEvent = EventRepository.getDayEvent(eventID, year, month, day);
            return View(thisEvent);
        }



        [HttpPost]
        public ActionResult Delete(EventModel deletedEvent) //here Model only has 0, "", and 1/1/0001
        {
            EventRepository.DeleteEvent(deletedEvent);
            return RedirectToAction("Index", new { year = deletedEvent.EventDate.Year, month = deletedEvent.EventDate.Month, day = deletedEvent.EventDate.Day });
        }
4

4 に答える 4

3

値ごとにHiddenForを追加してみてください

@Html.HiddenFor(m => m.EventID)

これにより、フォームが送信されたときに値がサーバーに確実にポストバックされます。

あなたが価値を提供する必要があるならば、私はここで提供される受け入れられた答えが好きです

于 2012-04-20T16:17:35.927 に答える
3

フォームにデータが含まれていないため、モデルは空です。ラベルはデータとは見なされません。それらはデータのラベルです。必要なものはこれです:

@Html.LabelFor(m => m.Subject, "Person or Interest")<br /> 
@Html.DisplayFor(m => m.Subject)

編集EventId:上記の部分をより明確にするために、削除を処理するためにのみ必要であるという点でglosrobが正しいことを強調する必要があります。それ以外はすべて、正しい情報を表示して、ユーザーが正しいレコードを削除していることを確認できるようにするためのものです。ラベルはフォーム データとは見なされず、視覚的な表示であることを強調したかっただけです。

ただし、ここで注意すべき点がいくつかあります。

まず、EventId変更に対してオープンであってはならないため、 でレンダリングする必要があります@Html.HiddenFor(m => m.EventId)。これにより、ユーザーが見ることができない隠しフィールドとしてレンダリングされます。これは、変更できないという意味ではなく、最終的にAntiForgeryTokenを使用してそれを防ぐ必要があります。

次に、ラベルの文字列を指定する必要はありません。データ注釈を使用する代わりに、ビューモデルでそれを行うことができます。

// DisplayName is in System.ComponentModel and not System.ComponentModel.DataAnnotations;
using System.ComponentModel;  

public class EventViewModel
{
    [DisplayName("Person or Interest")]
    public string Subject { get; set; }
}

次に、ビューで を使用できます@Html.LabelFor(m => m.Subject)

于 2012-04-20T16:31:12.607 に答える
2

OK、問題は、フォームにラベルしかなく、入力がないことです。入力値がサーバーに送信され、ASP.NETMVCがモデルクラスにバインドされます。

代わりに(ラベルがあるだけで、ラベルはポストペイロードの一部ではありません)

@Html.LabelFor(m => m.EventDesc, "Description")<br />
@Html.LabelFor(m => m.EventDesc, Model.EventDesc)

<input />持っている必要があります(テキストボックスはhtmlタグでレンダリングされます)

@Html.LabelFor(m => m.EventDesc, "Description")<br />
@Html.TextBox(m => m.EventDesc)

@glosrobのコメントにも同意します。IDを表示/編集を許可する必要はありません。POSTでモデルに正しくバインドされるように、非表示の入力に依存する必要があります

@Html.HiddenFor(m => m.EventID)
于 2012-04-20T16:22:31.800 に答える
1

ポストバックが削除しようとしているアイテムを通過していないようです。モデルの ID を渡すために使用HiddenFor(m => m.EventID)するか、フォームのルート値に入れるだけです。

@using (Html.BeginForm("Delete", 
                       "Event", 
                       new { idToDelete = Model.EventID }, 
                       FormMethod.Post))

もちろん、これを行うには、ID のみを使用するようにアクション メソッドを変更する必要があります。

于 2012-04-20T16:31:36.990 に答える