web-dev-qa-db-ja.com

MVC:ビューにパラメーターを渡しますか?

MVC初心者の質問:

go/{mainnav}/{subnav}という形式のURLを取得しています。これはGoControllerクラスのメソッドに正常にルーティングされています。

public ActionResult Index(string mainnav, string subnav) {
  return View();
}

ここまでは順調ですね。しかし、mainnavまたはsubnavの値に応じて、ビューが異なるHTMLを返すようにしたいと考えています。具体的には、javascriptブロック内に次の行を含めます。

myobj.mainnav = [value of mainnav parameter];

そして、subnavがnullまたは空でない場合のみ

myobj.subnav = [value of subnav parameter];

分離コードのないaspxページにこれらのパラメーターをどのように渡しますか?

14
Shaul Behr

ViewModelクラスを使用してデータを転送します。

public class IndexViewModel
{
    public string MainNav { get; set; }
    public string SubNav { get; set; }

    public IndexViewModel(string mainnav, string subnav)
    {
        this.MainNav = mainnav;
        this.SubNav = subnav;
    }
}

その後、アクションメソッドが表示されます

public ActionResult Index(string mainnav, string subnav)
{
    return View(new IndexViewModel(mainnav, subnav));
}

これは、ビューを厳密に入力する必要があることを意味します。

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<YourNameSpace.IndexViewModel>" %>

ビューで、次のようにデータを出力します。

myobj.mainnav = <%: Model.MainNav %>;

MVC3を使用する場合の代替ソリューションは、動的ViewBagを使用することです。

public ActionResult Index(string mainnav, string subnav)
{
    ViewBag.MainNav = mainnav;
    ViewBag.SubNav = subnav;
    return View();
}

そのようにページでアクセスされます:

myobj.mainnav = <%: ViewBag.MainNav %>;

ただし、 nobtrusive javascript を読んで、この特定の問題を回避するために設計を改善できるかどうかを確認することをお勧めします。

31
Tomas Aschan

MVC3を使用している場合、値をViewBagに渡すことをお勧めします。

ViewBag.MainNav = "xxxx";
ViewBag.SubNav = null;

次に、JavaScriptを定義して値を追加するビューページで。

ViewData["MainNav"])を使用する場合、MVC 3を持っていない場合、値を保存しても同じ効果があります。

3
Luke Duddridge

ビューのリクエストからパラメーターにアクセスしようとしましたか?

つまり.

Request.Params["mainnav"]

または

Request.Params["subnav"]

MVCで動作します

2
Tejasvi Hegde

私は次のアプローチを使用しています:

ViewModel.class:

public class TitleBodyModel
{
    public string Title { get; set; }

    public string Body { get; set; }

    public TitleBodyModel() { Title = Body = ""; }

    public TitleBodyModel(string t, string b) { this.Title = t; this.Body = b; }
}

メインビューで:

@Html.Partial("_TitleBody" , new XXX.Models.TitleBodyModel("title", "body" ))

次に、部分ビューで:

@model XXX.Models.TitleBodyModel


<div class="bl_item">
    <div class="bl_title">@Model.Title</div>

    <div class="bl_body">@Model.Body</div>
</div>
1
Stefan Michev

私はこれが解決策であると理解すれば:

public ActionResult Index(string mainnav, string subnav)
{
   return View(mainnav | subnav);
}

HTMLビューでは、View以降を使用できます

<%=Model %>