次のような URL があるとしましょう: localhost/userdetails/5
where5
はユーザー ID です。ID をビュー (かみそりビューエンジン) で直接利用して詳細を表示する方法はありますか? または、コントローラーのデフォルト アクションで処理しますか?
5 に答える
をビューに取得することに焦点を合わせて、物事をシンプルに保つためにid
、基本的に を使用しid
てモデルにデータを入力し、それをビューに渡します。したがって、コントローラーで:
public ActionResult Index(int id)
{
UserModel model = db.Users.Where(u => u.Id == id).SingleOrDefault();
return View(model);
}
ビュー (非常に簡略化) は次のようになります。
@model MyProject.Models.UserModel
@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Username)
ただし、これは非常に基本的なことです。最終的には、データ ソースから直接取得したドメイン モデルではなく、ビューにビューモデルを使用する必要があることに気付くようになります。それ自体が、ドメイン モデルからビューモデルへのプロパティのマッピングという形で解決すべき別の問題をもたらします。通常、AutoMapperまたはValueInjecterがそのために使用されます。ただし、現時点では、データをビューに渡し、それをコントローラーに戻して何かを実行できるようにすることに集中することをお勧めします。
アップデート
これは、データをコントローラーに戻す方法を示す簡単なシナリオです。したがって、基本的には、送信するフォームがあります。
@using (Html.BeginForm("Index", "Home"))
{
// Form elements and submit button
}
これにより、このアクション メソッドにデータがポストされ、データに対して必要なことを行うことができます。
[HttpPost]
public ActionResult Index(UserModel inputModel)
{
// Check to see if the model's data was valid.
if (ModelState.IsValid)
{
// Do something in the database here.
// Then redirect to give the user some feedback.
return RedirectToAction("Thanks");
}
// The model validation failed so redisplay the view.
return View(inputModel);
}
モデル (つまり、ビューに返されたモデル) を使用する必要があります。ViewBag は別のオプションですが、ID はモデル自体の一部であるため、それを行う意味はありません。
意見
@model User
@{
ViewBag.Title = "User Details";
}
@Model.Id;
コントローラ
public ActionResult UserDetails(int id)
{
return View("UserDetails", (object)id);
}
これは、コントローラーまたはビューの両方で拡張メソッドとして使用できます。例: ルート ID ホルダーが global.asax にデフォルト値を持っていると仮定します。
public int IdFromAdress(HttpContext httpContext)
{
RouteData rd = httpContext.Request.RequestContext.RouteData;
string stringId = (string)rd.Values["id"];
return int.Parse(stringId);
{
これでIDを取得できます
@HttpContext.Current.Request.RequestContext.RouteData.Values["id"].ToString()
ただし、ViewMdoel を使用して値をビューに渡すことをお勧めします。ViewBag ではなく、ビューから直接アクセスすることをお勧めします。
はい、できます。それを行う方法は複数ありますが、投稿 MVC にタグを付けたので、「MVC の方法」、つまり (imo) ビュー モデルを使用することを希望すると仮定します。
だからあなたはビューモデルを書く
public class MyViewModel()
{
public int ID {get; set;}
}
コントローラーにモデルを入力し、それをビューに渡します
public ActionResut MyView (int id)
{
var viewModel = new MyViewModel {ID = id};
return View (viewModel);
}
次に、強く型付けされたビュー (つまり、MyViewModel に強く型付けされたビュー) があり、モデルのプロパティを参照できます。
@Model.ID
次に、これを便利にするために、使用したい他のプロパティをビュー モデルに追加できます。次に、ビューをレンダリングする前にそれらをコントローラーに入力するか (たとえば、ユーザー情報を表示するため)、またはユーザーがビューにそれらを入力できるようにすることができます (フォームにラップされたテキストボックスなどを使用)。次に、コントローラーの投稿アクションでユーザー入力を次のように収集できます
[HttpPost]
public ActionResult MyView(MyViewModel viewModel)
{
//do stuff with the data from the viewModel
}