【问题标题】:Given Value is not rendering in Razor input field给定值未在 Razor 输入字段中呈现
【发布时间】:2016-03-15 11:55:15
【问题描述】:

已解决:必须从部分中删除布局。

我有以下输入:

@Html.Hidden("VendorId", (string)ViewBag.VendorId)

它不会呈现来自ViewBag 的值,因此,在尝试了我在这种情况下所知道的一切之后(即使使用 html 而不是 razor,该值仍然为空),我认为是时候尝试用jQuery 解决这个问题,但事情变得越来越奇怪。以下不起作用:

$("#VendorId").val(id);
$("#VendorId : input").val(id);

但即使 jquery 至少有一个语法错误,这也有效:

$("#VendorId : input").val() = id;
$("VendorId : input").val() = id;

所以,我的问题是,是我自己还是这真的错了?如果它是错误的,任何人都可以想到发生这种情况的任何原因吗?我猜测 razor 和 jquery 的行为以某种方式连接但无法弄清楚,所以我需要一些帮助。很确定这是显而易见的。

我正在使用jQuery 1.10.2

这是我为ViewBag设置值的地方:

public async Task<PartialViewResult> SelectvendorList(string VendorId)
{
    ViewBag.VendorName = await _vendorService.GetVendorName(VendorId);
    if (VendorId == null) VendorId = "";
    ViewBag.VendorId = VendorId;

    var lists = await _vendorListService.GetAllForSelectList(User.Identity.GetUserId(), VendorId);

    IEnumerable<SelectListItem> vendorLists = lists.Select(b => new SelectListItem { Value = b.Id, Text = b.Description });
    ViewBag.vendorLists = vendorLists;

    return PartialView();
}

我也有这一段,它正确地呈现了价值:

<p id="hiddenVendorId" style="display:none">@vendorId</p>

这是整个视图:

@{
    ViewBag.Title = "SelectvendorList";
    Layout = "~/Views/Shared/_Purchasing.cshtml";
    var vendorId = ViewBag.VendorId;
}

<p>New Order / Select vendor list</p>

<h4>Vendor : @ViewBag.VendorName</h4>
<p id="hiddenVendorId" style="display:none">@ViewBag.VendorId</p>

@using (Html.BeginForm("AddRemoveItems", "Order", FormMethod.Get))
{
    @Html.Hidden("VendorId", (string)ViewBag.VendorId)
    <div class="form-group flex">
        @Html.Label("VendorListID", "Vendor Lists", htmlAttributes: new { @class = "control-label" })
        <div class="">
            @Html.DropDownList("VendorListID", (IEnumerable<SelectListItem>)ViewBag.vendorLists, "", htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessage("VendorListID", "", new { @class = "text-danger" })
        </div>
    </div>
    <input type="submit" value="Next" />
    <input type="button" id="backButton" onclick="javascript:history.go(-1)" value="Back" />
    @Html.ActionLink("Continue with no Vendor List", "AddRemoveItems", new { VendorId = vendorId, VendorListID = "" })
}

【问题讨论】:

  • 你确定在你的控制器方法中设置ViewBag.SomeValue吗?
  • @Html.Hidden("VendorId", (string)ViewBag.SomeValue) 将使用value="xxx" 生成隐藏输入,其中ViewBag.SomeValue = "xxx" 您不需要任何脚本。
  • 不想为简单的字符串设置模型” - 看看你节省的所有时间!
  • @Spluf - 有没有可能我们在这里没有看到正确的控制器?您返回的是部分视图,如果我没记错的话 - 您发布的视图不是部分视图。
  • 很高兴我能提供帮助 - 不幸的是,我无法将其发布为答案,因为我真的无法解释为什么会发生这种情况。再次,很高兴我们帮助您完成了它。

标签: jquery asp.net asp.net-mvc razor


【解决方案1】:

考虑到

<p id="hiddenVendorId" style="display:none">@vendorId</p>

呈现正确的值,您可以考虑在隐藏输入中使用相同的变量,而不是 ViewBag

@Html.Hidden("VendorId", vendorId)

【讨论】:

  • 我试过了,不工作,没有意义......但是如果我用段落中的 viewbag 替换@vendorId,它仍然可以正常工作..
  • 将您的控制器方法添加到问题中,以及您与视图中的变量的任何交互。
  • 所以你的意思是,在两个不同的地方显示同一个变量的值之间的某个地方,它以某种方式变成了null
  • 我现在发布了整个视图,没有从那里删除 ViewBag 中的值,但在同一个视图中,值既被渲染又被忽略。
【解决方案2】:

我建议您不要使用ViewBag 动态对象将信息传递给您的视图,而是创建一个简单的ViewModel。例如

public class VendorViewModel
{
   public string VendorId {get; set;}
   public string VendorName {get; set;}
   public IEnumerable<SelectListItem> VendorList {get; set;}
}

在您看来,在顶部定义正在使用的模型

@model VendorViewModel

然后渲染你的隐藏输入:

@Html.HiddenFor(v => v.VendorId)

【讨论】:

    【解决方案3】:

    要在 razor 中输入 alue 和 id,请执行以下操作

    @Html.HiddenFor(m => m.VendorId, new{ @Value = ViewBag.SomeValue}, new {@id ="VendorId"})
    

    考虑 ViewBag.SomeValue 的值为“供应商”
    这将呈现一个 html 输入标签,如

    <input type="text" value="vendor" id="VendorId" name="VendorId">
    

    在javascript中
    获取输入值

    $("#VendorId").val();
    

    为输入字段赋值

    var id = "VendorId";
    $("#VendorId").val(id);
    

    希望对你有帮助

    【讨论】:

    • 这看起来像是所有应该工作的东西的组合(我已经尝试过)但仍然没有:)。感谢您的尝试:)
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多