【问题标题】:Using an HTML ActionLink route argument when having a "dual" view model在具有“双”视图模型时使用 HTML ActionLink 路由参数
【发布时间】:2016-05-07 12:18:47
【问题描述】:

在我的 ASP.NET MVC 5 应用程序中,我有以下项目的索引视图(从数据库中的 Projects 表中检索)。

@using Leepio.Models
@using Microsoft.AspNet.Identity
@model ApplicationTwoViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create" ,"Projects")
</p>
<table class="table">
    <tr>
        <th>
            @Html.ActionLink("Title", "Index",  new {SortOrder = (ViewBag.SortOrder==null?"Asc":(ViewBag.SortOrder=="Asc"?"Desc":"Asc")), SortBy = "Title"})

        </th>
        <th>
            @Html.ActionLink("Application Deadline", "Index", new {SortOrder = (ViewBag.SortOrder == null ? "Asc" : (ViewBag.SortOrder == "Asc" ? "Desc" : "Asc")), SortBy = "ApplicationDeadline"}) <br/>
            @Html.ActionLink("Hourly Rate (DKK)", "Index", new { SortOrder = (ViewBag.SortOrder == null ? "Asc" : (ViewBag.SortOrder == "Asc" ? "Desc" : "Asc")), SortBy = "HourlyRate" })
        </th>
       <th>
            @Html.ActionLink("Skill requirements", "Index", new { SortOrder = (ViewBag.SortOrder == null ? "Asc" : (ViewBag.SortOrder == "Asc" ? "Desc" : "Asc")), SortBy = "RequiredSkills" })
        </th>


    </tr>

@foreach (var item in Model.Model1) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ApplicationDeadline)<br/>
            @Html.DisplayFor(modelItem => item.HourlyRate)
        </td>
       <td>
            @Html.DisplayFor(modelItem => item.RequiredSkills)
        </td>


        <td>

            @if(item.UserId == User.Identity.GetUserId()) 

            {
                @Html.ActionLink("Edit", "Edit",  new {id = item.ProjectId})

                @Html.ActionLink("Delete", "Delete", new {id = item.ProjectId}) 
            }

            @Html.ActionLink("Details", "Details", new {id = item.ProjectId}) |

            @Html.ActionLink("Apply", "Create", "Applications" , new { id = Model.Model2.ApplicationId }) |
        </td>
    </tr>
}

</table>
@{
    double TotalPage = @ViewBag.TotalPages;
}

<ul class="pagination">
    @for (int i = 1; i <= TotalPage; i++)
    {

        if (i == ViewBag.Page)
        {
            <li class="active"> @Html.ActionLink(i.ToString() + " ", "Index", "Projects", new { SortOrder = (ViewBag.SortOrder == null ? "Asc" : ViewBag.SortOrder), SortBy = (ViewBag.SortBy == null ? "Title" : ViewBag.SortBy), Page = i })</li>
        }
        else
        {
            <li>
                @Html.ActionLink(i.ToString() + " ", "Index", "Projects", new { SortOrder = (ViewBag.SortOrder == null ? "Asc" : ViewBag.SortOrder), SortBy = (ViewBag.SortBy == null ? "Title" : ViewBag.SortBy), Page = i })
            </li>
        }

    }
</ul>

我正在使用我创建的 ApplicationTwoViewModel,它基本上有两个视图模型:

public class ApplicationTwoViewModel
{
    public IEnumerable<Project> Model1 { get; set; }
    public Application Model2 { get; set; }
}

我正在尝试制作这个 ActionLink

 @Html.ActionLink("Apply", "Create", "Applications" , new { id = Model.Model2.ApplicationId }) |

从 ApplicationsController 中的 Create ActionRestult 创建一个新的“应用程序”:

public ActionResult Create()
{
    return View();
}

// POST: Applications/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ApplicationId,ProjectId,UserId,CoverLetter")] Application application)
{
    if (ModelState.IsValid)
    {
        db.Applications.Add(application);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(application);

应用模型:

public class Application
{
    public int ApplicationId { get; set; }
    public int ProjectId { get; set; }
    public string UserId { get; set; }
    public string CoverLetter { get; set; }
}

所以现在我正在尝试创建“应用”ActionLink,以便创建视图从项目索引视图接收 ProjectId,就像编辑/删除/详细信息接收 ProjectId 一样,我不确定如何执行此操作。

现在它可以工作,但您必须手动插入 ProjectId 和 UserId(登录的应该是 User.Identity.GetUserId() 但我不确定在这种情况下在哪里添加它),我想要它们在幕后被检索,因此用户只需编写 CoverLetter 然后创建应用程序。

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-mvc-5 html.actionlink


    【解决方案1】:

    您需要在 Create() 方法中添加一个参数,并使用该值初始化您的模型并将其传递给视图

    public ActionResult Create(int projectId)
    {
        Application model = new Application()
        {
            ProjectId = projectId 
        };
        return View(model);
    }
    

    并修改您的链接以传递值(当前将值添加为 html 属性,而不是路由值(注意第 5 个参数)

    @Html.ActionLink("Apply", "Create", "Applications" , new { projectId = item.ProjectId }, null)
    

    然后在视图中,包含ProjectId 的隐藏输入,以便将其提交给 POST 值

    @Html.HiddenFor(m => m.ProjectId)
    

    请注意,您的 UserID 值应在保存 Application 之前添加到 POST 方法中(不在模型或视图中)

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ProjectId, CoverLetter")] Application application)
    {
        if (ModelState.IsValid)
        {
            applicatio.UserId = User.Identity.GetUserId(); // set the user here
            db.Applications.Add(application);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(application);
    }
    

    旁注:您的ApplicationTwoViewModel 模型的用途并不清楚。您在视图中使用的只是IEnumerable&lt;Project&gt;,因此您的Model2 属性似乎是不必要的

    【讨论】:

    • 如果我的创建是这样的:public ActionResult Create([Bind(Include = "ApplicationId,ProjectId,UserId,CoverLetter")] Application application) { if (ModelState.IsValid) { db.Applications .添加(应用程序); db.SaveChanges(); return RedirectToAction("索引"); } 返回视图(应用程序); } 我应该摆脱绑定吗?
    • 您真正应该做的是使用视图模型 - ApplicationVM,其中仅包含属性 ProjectIdCoverLetter。但是,如果您使用数据模型,那么它应该只是 [Bind(Include="ProjectId, CoverLetter")],因为这是您需要的唯一 2 个属性
    • 恐怕我不太明白你想说什么。你是说我应该创建一个新的视图模型还是使用 ApplicationViewModel ?
    • 你已经有一个类名ApplicationViewModel了吗? (您显示的是ApplicationTwoViewModel,这似乎有点毫无意义,因为您从不使用或不需要Model2 属性。您显示的视图可能只是@model IEnumerable&lt;Project&gt;,只需将循环更改为@foreach (var item in Model) {
    • 是的,我有一个名为 "Application" 的视图模型,创建视图当前正在使用它。我应该只使用它并删除 ApplicationTwoViewModel 吗?我应该如何像你之前说的那样修改 Create() (删除 ApplicatoinId 和 UserId)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多