【问题标题】:JQuery doesn't work in javascript when partial is returned from controller after post发布后从控制器返回部分时,JQuery 在 javascript 中不起作用
【发布时间】:2016-04-18 20:45:33
【问题描述】:

我在 Visual Studio 制作一个 asp.net 项目。我有两个控制器函数 [HttpGet] AccountCreate 和 [HttpPost] AccountCreate。 Get 返回一个带有模型 AccountCreatePageModel 的 PartialView。一切都在这里,我的 javascript 和 jquery 是可靠的。当我提交表单时,我会检查以确保输入是唯一的,如果不是,我将部分视图以与 Get 相同的方式发回。但是当它加载并尝试运行 javascript 时,每个使用 $ 用于 jquery 的地方都会中断,所以我想它不再知道 jquery 是什么了。怎么会这样?这一切的完成方式与 Get 相同。

    [HttpGet]
    public PartialViewResult AccountCreate(Guid functionId, long? parentId)
    {
        AccountCreatePageModel model = new AccountCreatePageModel
        {
            Function = DataFactory.SystemAccess.GetFunction(functionId),
            ParentId = parentId
        };

        if (parentId != default(long?))
        {
            model.Account = DataFactory.PartyAccess.GetAccount((long)parentId);
            model.Organization = DataFactory.PartyAccess.GetOrganizationByAccountId(model.Account.Id);
            model.Person = DataFactory.PartyAccess.InitializePerson();
            model.Account.Id = (long)parentId;                
        }
        else
        {
            model.Account = DataFactory.PartyAccess.InitializeAccount();
            model.Organization = DataFactory.PartyAccess.InitializeOrganization();
            model.Person = DataFactory.PartyAccess.InitializePerson();
            model.Address = DataFactory.PartyAccess.InitializeAddress();
        }

        model.PhoneNumber = new PhoneNumberModel();

        return PartialView(model);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AccountCreate(AccountCreatePageModel model)
    {

        long id = 0;
        long phoneNumberParentId = 0;
        long accountId = 0;

        if (model.Account.Id > 0)
        {
            accountId = model.Account.Id;
        }
        else
        {
            accountId = DataFactory.PartyAccess.UpsertAccount(model.Account, true).Id;
            model.Function = DataFactory.SystemAccess.GetFunction(model.Function.Id);
            if (accountId == -1)     //Account.AccountId already exists, send message back to user
            {
                return PartialView(model); //this returns my partial back
            }
        }

这是 razor HTML

@using Application.Web.Extensions
@model Application.Web.Models.AccountCreatePageModel

@if ((Model.Organization.Id == 0) && (Model.Person.Id == 0))
{
    <script type="text/javascript">
        $(function () {
            $('#Organization_Name').rules('remove');
            $('#Person_LastName').rules('remove');
            $('#btnSave').click( function (e) {

                if (($('#Organization_Name').val() == "" &&         $('#Person_LastName').val() === "") || ($('#Person_FirstName').val() !== "" && $('#Person_LastName').val() === "")) {
                    e.preventDefault();
                    document.getElementById("OrgLastNameError").innerHTML =      "Organization Name or Last Name must be provided";
                }
                if ($('#Person_FirstName').val() !== "" &&   $('#Person_LastName').val() === "") {
                    e.preventDefault();
                    document.getElementById("OrgLastNameError").innerHTML =   "Last Name must be provided";
                    $('#Person_LastName').focus();
                }

                //if($('#'))

            });
        });
    </script>
}
@Html.HiddenFor(model => model.Function.Id)
<div class="row">
    <div id="OrgLastNameError" class="text-danger"></div>
</div>

<div class="row">
    @Html.PartialFor(model => Model.Account, "_AccountEdit", new    ViewDataDictionary { { "Readonly", (Model.Account.Id > 0) } })
</div>
<div class="row">@Html.PartialFor(model => Model.Organization,   "_OrganizationEdit", new ViewDataDictionary { { "Readonly",   (Model.Organization.Id > 0) } })</div>

<div class="row">@Html.PartialFor(model => Model.Person, "_PersonEdit")  </div>

【问题讨论】:

  • 请添加代码-前端代码
  • 这里有控制器代码和使用的直接 html 代码。顶部的 javascript 在遇到第一个“$”符号时会中断,并说明它如何不知道它是什么
  • 第一次遇到 $ 时说代码中断是什么不起作用
  • 我明白了:0x800a1391 - JavaScript 运行时错误:'$' 未定义
  • 如果我点击继续,每个使用 jquery 或 '$' 的地方都会运行一个 javascript 错误

标签: jquery asp.net http-post http-get


【解决方案1】:

我没有加入评论讨论的声誉,所以我会在这里发帖。这里有很多很好的答案:

Javascript Runtime error: $ is undefined

我还想说,您没有充分利用该模型。我建议在模型本身的控制器中处理发生的验证。在您的控制器中,您可以添加:

        if (accountId == -1)    
        {
            ModelState.AddModelError("", "Your account id already exists.")
            return PartialView(model); //this returns my partial back
        }

然后您可以在视图中显示:

Html.ValidationSummary(true)

另外,我看到您正在本地验证字段,这可能由于多种原因而出现问题。 MVC 还为我们提供了在模型中添加验证的选项。如果你添加到你的模型属性:

[Required]
public string MyModelProperty{get; set;}

当用户尝试在该字段中没有任何数据的情况下提交表单时,模型将引发错误。

【讨论】:

  • 问题似乎是它没有通过我的 _Layout 来获取我所有的 jquery 和特殊脚本以及 css 样式。 _Layout 也是我为每个屏幕抓取导航栏的地方。当我从我的 Post 方法返回部分时,它没有得到任何东西。它只返回部分,因此它没有任何对样式或 jquery 或任何东西的引用。如果我通过所有 javascript 错误都没有问题,我只会得到我部分的 html。我的其他东西都没有,比如通常从我的 _Layout 抓取的导航栏
  • 您是否将布局视为主视图?它被命名为 partialView。尝试返回您真正想要的特定部分,我不确定默认情况下没有视图名称参数的 PartialView() 返回什么。
  • return PartialView("_YourPartialName", model);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2022-01-25
  • 1970-01-01
  • 2011-10-02
  • 2021-04-30
  • 2011-04-03
相关资源
最近更新 更多