1

たとえば、ユーザークラスとユーザーワークの子クラス(エンティティフレームワークのスキャフォールディングクラス)を使用した親子の状況があります。コントローラー ウィザードを使用して、CRUD メソッドとビューをスキャフォールディングしました。2 つの Create メソッド、Get メソッドと httpPost メソッドを足場にしました。

通常のシナリオでは、ユーザーの ID を get に渡し、html.beginform() セクションに入力されているモデルに渡され、その後、post に渡されるようにしたいと考えています。

これを行う正しい方法は何ですか?Get を以下のように変更しました

public ActionResult Create(int id)
 {
     this.ViewData.Add("id", id);
     return View();
 }

および以下のように Create.shtml

@model UserWork

@{
    ViewBag.Title = "Create";
    int id = (int)ViewData["id"];
}

<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

@using (Html.BeginForm(routeValues:new {user_id = @id})) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Userwork</legend>

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

(フォームがロードされたときに事前入力されていることをテストできるように、スキャフォールディングされたuser_idフィールドを編集可能なままにしました)フォームがロードされ、フィールドにID値がありません。これはこれを達成する正しい方法ですか?

乾杯ティム

4

4 に答える 4

1

したがって、私の最初の質問は、MVCとルーティングの理解について他のいくつかの質問を提起しました。1つのパラメータを整数としてルートに次の形式で渡すと、

http://mydomain/controller/myaction/123 

私のアクションメソッドが次の形式の場合

public ActionResult Create(int id)
        {}

すべてがクールですが、その形である場合

 public ActionResult Create(int user_id)
        {}

次に、必要なパラメーターuser_idが入力されていないという例外が発生していました。以下のようにマッピングを追加しましたが、これはビューに正しく入力されているようです。

routes.MapRoute("Create", "{controller}/Create/{user_id}",new {action = "Create"});

上記のルートを使用すると、ユーザーIDがモデルのuser_idフィールドに正しく渡されるため、モデルをインスタンス化せずにビューに渡すことにしました。

乾杯ティム

于 2012-05-25T07:56:31.963 に答える
1

ビューにモデルを渡していません。それは私にとって間違っています。ビューはUserWorkモデルに対して厳密に型指定されているため、コントローラー アクションは通常、ViewData または ViewBag を使用する代わりに、そのモデルのインスタンスをビューに渡す必要があります。

public ActionResult Create(int id)
{
    var model = new UserWork();
    model.user_id = id;
    return View(model);
}

そしてビューで:

@model UserWork

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

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

    <fieldset>
        <legend>Userwork</legend>

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

また、フォーム内のこのフィールドに対応するエディター テンプレートがあるため、Html.BeginFormを再度渡す必要がないことにも注意してください。user_idただし、通常、ユーザーが編集中のエンティティの ID を変更できるように、テキスト入力フィールドは存在しないはずです。この場合、ルート データまたは隠しフィールドを使用できます。

于 2012-05-25T05:59:26.473 に答える
1

親子関係で同じタイプの問題がありました。しかし、以下のルートを作成することで解決しました:

routes.MapRoute(
                "route_name",
                "Parents/{parent_id}/{controller}/{action}/{id}",
                new { action = "list", id = UrlParameter.Optional },
                new { parent_id= @"\d+" }
            );

あなたの場合、それは-

routes.MapRoute(
                "User_Route",
                "Users/{user_id}/{controller}/{action}/{id}",
                new { action = "list", id = UrlParameter.Optional },
                new { user_id= @"\d+" }
            );

UserWorke- の URL の例

(siteurl)/Users/1/UserWork/list
(siteurl)/Users/1/UserWork/New
(siteurl)/Users/1/UserWork/Edit/1

など……。

このルートを使用すると、リダイレクト時に user_id を何度も渡す必要がないため、あるアクションから別のアクションに簡単にナビゲートできます。また、ナビゲートしている内容について URL で明確な画像を提供します。

于 2012-05-25T10:13:49.787 に答える
1

ViewData で Id を渡しても問題ありませんが、MVC3 を使用しているため、代わりに ViewBag を使用します。これは基本的に、キャストの必要性を取り除く ViewData の動的ベースのラッパーです。

コントローラ:

this.ViewBag.UserId = userId;

ViewBag.UserIdその後、ビューのように ViewBag プロパティにアクセスできます

于 2012-05-25T05:48:13.243 に答える