2

私は次のコントローラーHomeControllerを持っていますaction method

[HttpPost] 
public ActionResult DisplayData(MyViewModel myViewModel)
{
   // Do something with myViewModel           
}

ViewModel:_

public class MyViewModel
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public bool IsPeriod { get; set; }
}

そして以下View

@model AppName.ViewModels.MyViewModel

@{ Html.RenderPartial("MyPartialView", Model);  }

<img src="@Url.Action("DisplayData", "Home", new { myViewModel = Model })" alt="Image" />

ここで説明されているようにUrl.Actionを使用しますが、DisplayDataアクションメソッドで取得するものはnullです。私が得たソースコードで:

<img src="/Home/DisplayData?filters=AppName.ViewModels.MyViewModel" alt="Image" />

したがって、実際には値ではなく型を渡します。

代わりに、ViewModel部分ビューに正しく渡されます。私は何が間違っているのですか?

4

5 に答える 5

13

私は通常、モデルに以下を追加します。

public class MyViewModel
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public bool IsPeriod { get; set; }

    public RouteValueDictionary RouteValues
    {
        get
        {
            var rvd = new RouteValueDictionary();
            rvd["name"] = Name;
            rvd["surname"] = Surname;
            rvd["isPeriod"] = IsPeriod;
            return rvd;
        }
    }
}

次に、Url.Action() 呼び出しで RouteValues プロパティを使用するだけです。

<img src="@Url.Action("DisplayData", "Home", Model.RouteValues)" alt="Image" />

または、より少ない (明示的な) コードを好む場合は、モデルの変更を無視して、単純に次のようにします。

<img src="@Url.Action("DisplayData", "Home", new RouteValueDictionary(Model)" alt="Image" />
于 2012-10-26T14:35:55.547 に答える
2

オブジェクト全体をクエリ文字列にシリアル化することはありません。各値を明示的に設定する必要があります。

new { nameFilter = @Model.Name, @Model.Surname, @Model.IsPeriod }

パラメータがルーティングでNameと呼ばれていない場合にのみ、nameFilterを指定する必要があります。

于 2012-10-26T11:22:21.977 に答える
1

ビューモデル全体を使用してimgsrcリンクを作成しようとしていますが、これが本当に必要なものではないと思います。

代わりに、モデルが表すIDをリンク(フィルター)のクエリ文字列パラメーターとして渡します。たとえば、...

<img src="@Url.Action("DisplayData", "Home", new { filters = Model.Id })" alt="Image" />

次のようなものをレンダリングするには...

<img src="/Home/DisplayData?filters=1" alt="Image" />

次に、アクションでIDを使用して、表示しようとしているリソースを検索できます。

于 2012-10-26T11:22:04.123 に答える
1

説明した方法でモデルを渡したい場合は、ViewModelクラスのToString()メソッドをオーバーライドする必要があります。これが、ViewModelオブジェクトをUrl.Actionメソッドに渡すとそのようなリンクが返される理由です。また、ViewModelをActionに渡す場合は、ModelBinderがそれを認識してActionパラメーターにバインドできるように、「http:// url / Action?Name = x&Surname = y&IsPerion=0」の形式でリンクを準備する必要があります。

于 2012-10-26T11:23:25.747 に答える
1

これを試しましたか、

<img src="@Url.Action("DisplayData", "Home", Model)" alt="Image" />
于 2012-10-26T14:58:21.680 に答える