-4

私はプロジェクトに取り組んでおり、C#には慣れていません。私は古い作業コードの後で作業しようとしました。違いは見つかりませんでした。

私のhtmlフォーム:

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.TicketID)
    <fieldset>
        <legend>Ticketdetail</legend>

          <div class="editor-label">
            @Html.LabelFor(model => model.Anmerkung)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Anmerkung)
            @Html.ValidationMessageFor(model => model.Anmerkung)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

アクション:

public ActionResult CreateDetail(int id)
{
    if (id == -1) return Index(-1);
    return View(new cTicketDetail(id, User.Identity.Name));
}

[HttpPost]
public ActionResult CreateDetail(cTicketDetail collection)
{


    //int TicketID = collection.TicketID;
    try
    {
        if (ModelState.IsValid)
        {
            collection.Write();
        }
        return RedirectToAction("Details", collection.TicketID);
    }
    catch
    {
        return this.CreateDetail(collection.TicketID);
    }
}

フォームをコミットした後のエラー

4

1 に答える 1

1

cTicketDetailアクションで使用した型にCreateDetailは、パラメーターのないコンストラクターがないようです。デフォルトのモデルバインダーはそれらをインスタンス化する方法を知らないため、コントローラーアクションは引数などのタイプをとることができません。

ここでのベストプラクティスは、ビューモデルを定義してから、ドメインエンティティを使用する代わりに、コントローラーアクションにこのビューモデルをパラメーターとして取得させることです。

ビューモデルを使用したくない場合cTicketDetailは、デフォルトのコンストラクターを持つようにタイプを変更する必要があります。

public class cTicketDetail
{
    // The default parameterless constructor is required if you want
    // to use this type as an action argument
    public cTicketDetail()
    {
    }

    public cTicketDetail(int id, string username)
    {
        this.Id = id;
        this.UserName = username;
    }

    public int Id { get; set; }
    public string UserName { get; set; }
}
于 2012-12-29T10:59:09.477 に答える