1

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

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

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

所以这里是分割成 2 个字符串的代码,如果我将总长度保持在 1800,它工作正常但是,如果我尝试添加第三个或将总长度增加到超过 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

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

4

1 回答 1

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 方法中查看您更改的许可证密钥是否在模型中。

希望能帮助到你!

于 2013-08-07T23:26:40.093 回答