【问题标题】:Model from PartialView to Controller returns null从 PartialView 到 Controller 的模型返回 null
【发布时间】:2019-08-05 10:10:54
【问题描述】:

我有一个接收模型 ID 的 PartialView,然后当您单击链接时,会将模型 ID 发送到控制器。我的问题是有两种方法可以将数据从 View 发送到 Controller,但只有一种对我有用。这是什么原因?

这对我来说非常有效

<a type="button" class="btn btn-primary" asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="@Model"><i class="fas fa-edit"></i></a>

这个没用

<a type="button" class="btn btn-success" href="@Url.Action("Edit/" + Model)"><i class="far fa-list-alt"></i></a>

我的问题是,如果我将模型 ID 传递给 URL,为什么最后一个不起作用并返回 null

这是我的完整 PartialView,它接收模型 ID 并且可以工作

@model int

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

<td style="width:150px">
    <div class="btn-group" role="group">
        <a type="button" class="btn btn-primary" asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="@Model"><i class="fas fa-edit"></i></a>
    </div>
</td>

这是我的控制器函数,用于接收数据

public async Task<IActionResult> Edit(int? wordId)
{
    if(wordId == null)
    {
        return NotFound();
    }

    var word = await _db.Dictionaries.FindAsync(wordId);
    if(word == null)
    {
        return NotFound();
    }

    return View(word);
}

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您正在使用的Url.Action 重载接受了一个动作名称,并且您将类似/Edit/4 的内容传递给它。您需要使用允许您指定路由值的Url.Action 方法的适当重载。

    它看起来像下面这样:

    <a type="button" class="btn btn-success" href="@Url.Action("Edit/" + Model)"><i class="far fa-list-alt"></i></a>
    

    <a type="button" class="btn btn-success" href="@Url.Action("Edit", new { wordId = Model } )"><i class="far fa-list-alt"></i></a>`
    

    附带说明,您的 Edit 操作采用可空的 wordId,这对我来说没有多大意义。通常,如果您正在编辑某些内容,那么它已经被创建并且应该总是有一个id。我能想到的唯一有意义的情况是Edit 操作是否实际处理创建数据以及编辑数据,在这种情况下这是完全有效的。

    【讨论】:

    • 补充一点,如果您使用选项 1 并在操作中重命名参数,我更喜欢使用 @Url.Action("Edit", new { Model } ) 而不是 @Url.Action("Edit/" + Model)。如果您必须向 URL 添加多个值,则使用此方法更容易维护和扩展。
    【解决方案2】:

    要回答您的主要问题,您的第一个锚点工作的原因是因为参数是正确的。 例如:

    <a asp-controller="Dictionary" asp-action="Edit" asp-route-wordId="1">Your link</a>
    

    相当于:

    <a href="/Dictionary/Edit/1"></a>
    

    这行得通!

    第二个不行,因为你误用了Url.Action,你使用的方法是这个Url.Action("Action")

    Url.Action("Edit/" + Model) or  Url.Action("Edit/1") 
    

    正在搜索名为“Edit/1”的操作,在您的情况下将找不到该操作。

    所以在你的第二个不工作的例子中

    <a href="@Url.Action("Edit/" + Model)">Your Link</a>
    

    相当于:

    <a href="null" />
    

    在您的情况下,您应该在锚点中使用它:

    Url.Action("Edit", "Dictionary", new { id = @Model })
    

    相当于 /字典/编辑/1

    所以:

    <a href="@Url.Action("Edit", "Dictionary", new { id = Model })">Your link</a>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多