0

「追加」ビューでコントローラーからの int を受け入れ、別の型を HttpPost コントローラー メソッドに返すようにしたい状況があります。紛らわしいですね。「追加」ビューは、ウィジェットとして型指定されたオブジェクトを作成するために使用されますが、WidgetCategory の ID を渡す必要があります。したがって、私の WidgetController には、次のようなメソッドがあります。

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    return View(id);
}

ただし、ビューでは、追加するウィジェットを返すことを意図しているため、次のように開始します。

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}
@using (Html.BeginForm())
{
    // Insert markup here ...
}

私の質問は、Widget を返すように入力された場合、WidgetCategoryID をコントローラーに渡すにはどうすればよいですか? 次のように、フォーム内の非表示フィールドとして追加することを望んでいました。

@Html.Hidden(id)

どんなアイデアでも大歓迎です。

ありがとう!

4

4 に答える 4

2

ViewModelWidgetWidgetCategoryIdプロパティがあると仮定する

public class Widget
{
  public int ID  { set;get;}
  public int WidgetCategoryId { set;get;}
  //Other properties
}

それをビューに送信しAddます(HttpGet)

public ActionResult Add(int id)
{
  Widget objModel=new Widget{ WidgetCategoryId =id} ;
  return View(objModel);
}

ビューで、 HTML ヘルパー メソッドAddを使用して隠し変数に保持します。HiddenFor

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";   
}
@using (Html.BeginForm())
{
    @Html.HiddenFor(m=>m.WidgetCategoryId);
    <input type="submit" value="Save" />
}

HTTPPostこれで、送信時にアクション メソッドにそれが含まれます。

[HttpPost]
public ActionResult Add(Widget model)
{
  //  check model.WidgetCategoryId and Have fun with it
}
于 2012-05-22T14:49:13.200 に答える
1

ビューコード内では、ビューが型を返すことを指定するだけでなくWidget、そのビューのモデル全体が型であることを指定しますWidget。基本的に、ビューを介してビューに出入りするデータは、タイプです。@modelWidget

ここでできることは、ビューの強い型を保持することですがWidget、単にID値(単純)を渡す必要がある場合は、またはのintいずれかを使用できます。ViewDataViewBag

たとえば、コントローラでは次のようになります。

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    // All properties of a ViewBag are completely dynamic!
    ViewBag.WidgetID = id;

    // You're still returning a View strongly-typed to a Widget, but not 
    // actually supplying a Widget instance.
    return View();
}

そして、ビューで:

@using MyProject.Models
@model Widget
@{
    ViewBag.Title = "My Title";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}
@using (Html.BeginForm())
{
    // Retrieve the WidgetID from the ViewBag
    var WidgetID = ViewBag.WidgetID;

    // Do something with the WidgetID, for example:
    @Html.Hidden(WidgetID)
}

ViewDataおよびViewBagは、「非モデル」データをビューに渡すことができる非常によく似たメカニズムであることに注意してください。ViewBagはより新しく(MVC 3)、C#4.0の機能に基づいていdynamicますが、ViewDataはキーと値のペアのコレクションに基づく古い方法です。

于 2012-05-22T15:04:13.427 に答える
1

デフォルトのモデル バインダーは、リクエスト パラメータを名前でチェックし、それに応じてモデルのプロパティを設定しようとします。より進化したものが必要な場合は、カスタム モデル バインディングを参照してください。ところで、アクションを次のように変更できます。

public ActionResult Add(Widget widget) // Widget class has one property named Id with public set
{
    return View(widget);
}

また

public ActionResult Add(int id) // 'id' is the WidgetCategoryID
{
    Widget widget = new Widget();
    widget.Id = id;
    return View(widget);
}

私は創作物としては第二形態の方が少し好きですが、それは好みの問題だと思います

ところで、ビューのフォームには、Widget オブジェクトの「重要な」プロパティごとに入力が必要です。(非表示またはテキスト)経由:

@Html.HiddenFor (m => m.Id);
于 2012-05-22T14:39:10.510 に答える
0

コントローラーの追加アクションでは、ViewBag プロパティを id に設定し、View 内のそれらは ViewBag プロパティを使用して html.Hidden() を実行できます。すなわち、

public ActionResult Add(int id) // 'id' is the WidgetCategoryID 
{     
   Widget widget = new Widget();     
   widget.Id = id;     
   ViewBag.categoryId = id;
   return View(widget); 
}

ビューで

@Html.Hidden(@:ViewBag.categoryId)
于 2012-05-22T14:44:05.167 に答える