【问题标题】:Controller name being lost when trying to post to controller action after file upload文件上传后尝试发布到控制器操作时,控制器名称丢失
【发布时间】:2016-09-07 01:56:42
【问题描述】:

我有一个包含几个动作的 MVC 控制器。一个动作负责改变速率。另一个负责上传文件。 当我和他们一起玩时,这些动作可以正常工作。但是,一旦我上传文件,如果我尝试更改速率,则发布操作将失败,因为它尝试发布的 url 缺少控制器名称。这是代码。 这是我在视图中的代码:

变化率:

<form method="post" action="@Url.Action("UploadPreparedContract")">
    @Html.Hidden("userApplicationId", Model.UserApplicationId)
    <div class="upload-section k-content">
        @Html.Kendo().Upload().Name("files")
        <input type="submit" value="Submit"/>
    </div>
</form>

<script type="text/javascript">
jQuery(function($) {
    var viewModel = kendo.observable({
        currentDisclosedRate: "@Model.CurrentDisclosedRate",            
        changeRate: function(e) {
            e.preventDefault();
            var self = this;

            var rawValue = $('#newDisclosureRate').val();
            var rate = parseFloat(rawValue);
            $.ajax({
                type: "POST",
                url: 'ChangeDisclosureRate',
                data: { newRate: rate, userApplicationId: @Model.UserApplicationId},
            }).done(function(result) {
                Notification.success('Rate changed');
                self.set("currentDisclosedRate", rawValue);
            })
            .fail(function(err) {
                Notification.error('Not changed. Customer may have placed order');
            });                
        },
    });

    kendo.bind($("#page"), viewModel);
});

这里是控制器

public class ContractPreparationController : Controller
{
   // GET: Application/ContractPreparation
    public ActionResult Index(int userApplicationId)
    {
        // logic to prepare model    
        return View(new ContractPreparationOutputModel()
        {
           // Model properties
        });
    }

    [HttpPost]
    public async Task<ActionResult> ChangeDisclosureRate(decimal newRate, int userApplicationId)
    {
        return await Command.ApplyAsync(new ChangeDisclosureRateCommand() {UserApplicationId = userApplicationId, NewDisclosureRate = BasisPoint.Percent(newRate) }) == Command.CommandResult.Succeeded
            ? new HttpStatusCodeResult(HttpStatusCode.OK)
            : new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    [HttpPost]
    public async Task<ActionResult> UploadPreparedContract(IEnumerable<HttpPostedFileBase> files, int userApplicationId)
    {
        if (files == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        if (files.Count() != 1)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "You must upload one file only");
        var application = applicationRepository.GetUserApplication(userApplicationId);
        if (application == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid user");

        var file = files.Single();
        var memberDocument = new  MemberDocument(blobService, application.FK_UserId);
        await memberDocument.Uploadfile(file);

        if (await Command.ApplyAsync(new UploadPreparedContractCommand() {FileGuid = memberDocument.FileGuid , UserApplicationId = userApplicationId, FileExtension = memberDocument.FileExtension}) == Command.CommandResult.Succeeded)
        {
            return RedirectToAction("Index", new {userApplicationId});
        }
        return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); // No expected failure case
    }
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 kendo-ui kendo-asp.net-mvc


    【解决方案1】:

    使用 Url.Action 辅助方法生成正确的相对 URL 到操作方法。

    url: '@Url.Action("ChangeDisclosureRate","ContractPreparation")',
    

    当 razor 为您的视图执行代码时,它将运行 Url.Action 方法并输出正确的 url(如果需要,它将具有控制器名称)。如果您确实查看了页面的源代码,则可以看到它。

    【讨论】:

    • @Shyju.. 为什么我们需要在 ajax 请求中提及 @url.Action("")。你能解释一下这背后的逻辑是什么
    • Url.Action 辅助方法返回指定操作方法的正确相对路径(基于路由定义)。使用这种方法比在你的 js 代码中硬编码更安全。
    【解决方案2】:

    尝试将控制器名称添加到您的 ajax url 参数中:

    url: 'ContractPreparation/ChangeDisclosureRate'
    

    否则 MVC 不知道使用什么控制器。

    【讨论】:

    • 我试过这个。如果我这样做,它将适用于我上面描述的情况,但如果我没有进行任何文件上传,则会导致问题。它会尝试发布到 'ContractPreparation/ContractPreparation/ChangeDisclosureRate' :(
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2017-11-22
    • 2018-04-14
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多