将长字符串发送到控制器

时间:2013-08-07 21:11:12

标签: asp.net-mvc razor max string-length

相关页面是我软件的设置页面。我希望用户将许可证密钥粘贴到textarea中。然后他们可以选择验证它(在控制器上完成验证)并且可以“应用”它(保存在服务器上的reg键中)

但是我似乎达到了可以发送到控制器的最大长度。密钥以字符串形式传递,但失败并出现错误,其长度超过2142个字符。 (我的钥匙大概是2500 ish)

所以我认为我会聪明并使用切片将很长的许可证密钥分成2或3个部分,但后来我似乎达到了一个略短的“整体”长度限制。

所以这里的代码分为2个字符串,如果我将总长度保持在1800,它就可以正常工作 但是,如果我尝试添加第3个或将总长度增加到超过2000(大致),我会得到一个错误,并且永远不会达到控制器的断点。

控制器

  Function UpdateLicense(Params As ConfigParams, NewLicenseKeyA As String, NewLicenseKeyB As 
   String) As EmptyResult
   Dim LicKey As String = NewLicenseKeyA + NewLicenseKeyB
   'just testing
   Return Nothing
  End Function

这是视图

$(document).ready(function () { 
$("#CheckLicense").bind("click", function () {
$.ajax({
   url: '@Url.Action("UpdateLicense", "Home")',
   data: { NewLicenseKeyA: ($("#NewLicKey").val()).slice(0, 900), NewLicenseKeyB: $("#NewLicKey").val()).slice(900, 1800) },
     success: function (data) {
       alert("Success!");  
     },
      error: function (xhr, ajaxOptions, thrownError) {
         //some errror, some show err msg to user and log the error  
      alert(xhr.responseText);
     }
});

我猜这个URL的总长度最终会阻止我,并且通过拆分字符串我会向URL添加更多内容,从而缩短了我发送许可证代码所需的空间。

任何想法..记得我是MVC和Web的新手。如果我的假设是正确的,那么我想也许我可以多次调用控制器,每个调用1000个字符,然后调用最后一个将它们连接在一起的调用。这有可能吗?

确定更新:我现在有一个解决方法。 这是更新的控制器

Function UpdateLicense(Params As ConfigParams, NewLicenseKeyPart As String, KeyName As String) As EmptyResult 
    Dim NewLicenseKey As String
    Select Case KeyName
      Case "A"
        RegistryHelpers.SetRegistryValue("Software\FormeWare\SCAR\", "LicKeyA", NewLicenseKeyPart)
        Return Nothing
      Case "B"
        Dim LicKeyPartA = RegistryHelpers.GetRegistryValue("Software\FormeWare\SCAR\", "LicKeyA", False)
        NewLicenseKey = LicKeyPartA + NewLicenseKeyPart
        'Proceed to Process
      Case Else
        'hmmmmm
    End Select
    Return Nothing
    End Function

所以这很有效,但似乎是实现我想要的一种非常粗鲁的方式.. 这样做的“正确”方法是什么?

1 个答案:

答案 0 :(得分:0)

这是我的模特:

namespace MvcApplication3.Models
{
    public class LicenseModel
    {
        public LicenseModel()
        {
            ID = 1;
            LicenseKey = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." +
                "In auctor nisi sed ultricies consectetur. Suspendisse euismod " +
                "sollicitudin tortor, nec accumsan eros facilisis sit amet. Integer" +
                "non felis vel risus fermentum accumsan. Vivamus gravida orci in libero" +
                "semper, nec ultrices turpis sodales. Quisque sit amet cursus dui, ac " +
                "pharetra eros. Morbi ultricies risus ut turpis molestie imperdiet. ";
        }

        public bool Save()
        {
            //do whatever to do to save
            return true;

        }

        public int ID { get; set; }
        public string LicenseKey { get; set; }
    }
}

我的控制器:

namespace MvcApplication3.Controllers
{
    public class LicenseController : Controller
    {
        //
        // View License/

        public ActionResult ViewLicense()
        {
            LicenseModel model = new LicenseModel();
            return View(model);
        }


        [HttpPost]
        public ActionResult UpdateLicense(int id, LicenseModel model)
        {
            if (ModelState.IsValid)
            {
                model.Save();

            }

            return View("ViewLicense", model);
        }

    }
}

我的强类型视图,模型声明位于顶部:

@model MvcApplication3.Models.LicenseModel
<h2>ViewLicense</h2>


@using (Html.BeginForm("UpdateLicense", "License", FormMethod.Post))
{<div>
    <div>@Html.HiddenFor(m=>m.ID) License Key :</div>
    <div>@Html.EditorFor(m=>m.LicenseKey)</div>
</div>
<div>
    <button type="submit" id="btnsubmit" value="SUBMIT">SUBMIT</button>
</div>
}

请注意,我没有使用ajax发布。

您需要修改RouteConfig.cs:

namespace MvcApplication3
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "License", action = "ViewLicense", id = UrlParameter.Optional }
            );
        }
    }
}

在控制器中放置一个断点,并在UpdateLicense方法中看到更改的许可证密钥位于模型中。

希望它有所帮助!