将Model变量绑定到ASP.NETMVC3中的Action方法

tktrz96b  于 2023-04-22  发布在  .NET
关注(0)|答案(5)|浏览(135)

我有一个控制器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来描述here,但我在DisplayData action方法中得到的是null。在源代码中我得到:

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

所以它实际上传递的是类型而不是值。
ViewModel却被正确地传递给了部分视图。我做错了什么?

jc3wubiy

jc3wubiy1#

我通常在模型中添加以下内容:

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" />
bvhaajcl

bvhaajcl2#

它不会将整个对象序列化为查询字符串,您必须显式设置每个值,即

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

如果您的参数在路由中不被称为Name,则只需要提供nameFilter。

xlpyo6sf

xlpyo6sf3#

你正在尝试使用整个视图模型创建一个img src链接,我不认为这是你真正想要的。
相反,你会将模型表示的任何东西的ID作为链接(过滤器)上的查询字符串参数传递。

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

渲染出类似于。。

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

然后,您可以在操作中使用ID来查找您试图显示的任何资源。

xxhby3vn

xxhby3vn4#

如果你想以你描述的方式传递model,那么你必须覆盖ViewModel类的ToString()方法,因为这就是为什么将ViewModel对象传递给Url.Action方法会返回这样一个链接的原因。另外,如果你想将ViewModel传递给Action,你必须以“http://url/Action?Name=x&Surname=y&IsPerion=0”的形式准备链接,这样ModelBinder才能识别它并绑定到Action参数。

9q78igpj

9q78igpj5#

你试过这个吗

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

相关问题