从PartialView到Controller的模型返回null

时间:2019-03-14 13:29:01

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

我有一个PartialView,它记录一个Model ID,然后在您单击链接时将Model ID发送给Controller。我的问题是,有两种方法可以将数据从View发送到Controller,但只有一种对我有用。是什么原因?

这对我来说很完美

Useless use of "-"

这没用

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

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

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

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

这是我的控制器功能,可以记录数据

@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>

2 个答案:

答案 0 :(得分:2)

您正在使用的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 :(得分:0)

要回答您的主要问题,您的第一个锚起作用的原因是因为args正确。 例如:

    Comparator<MyObject> xyzComparator = new Comparator<MyObject>() {

        @Override
        public int compare(MyObject o1, MyObject o2) {
            int diff = Boolean.compare(o1.isX(), o2.isX());
            if (diff != 0) {
                return diff;
            }
            diff = Boolean.compare(o1.isY(), o2.isY());
            if (diff != 0) {
                return diff;
            }
            diff = Boolean.compare(o1.isZ(), o2.isZ());
            // return whether 0 or not
            return diff;
        }
    };
    Collections.sort(myList, xyzComparator);

等效于:

<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")

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

所以在您的第二个无效示例中

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

等效于:

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

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

<a href="null" />

等效于     / Dictionary / Edit / 1

如此:

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