2015-10-27 4 views
0

Я пытаюсь создать кнопку, которая выполняет поиск базы данных для значения в проекте MVC. Я немного застрял после прочтения, чтобы сделать некоторые советы.Ссылка на контроллер с помощью jquery и ajax (url)

Actual cshmtl для создания

odel OncologyRTA.Controllers.oncologyPatient 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Add new patient</h2> 


@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <button type="button" name="button" value="find">Search</button> 


    <div class="form-horizontal"> 
     <h4><font color="red"><strong>LIVE Dataset</strong></font></h4> 
     <hr /> 
     @Html.ValidationSummary(true) 

     <dl class="dl-horizontal"> 
      <dt> 
       @Html.LabelFor(model => model.HospitalID, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.TextBoxFor(model => model.HospitalID, new { onkeyup = "InputToUpper(this);"}) 
       @Html.ValidationMessageFor(model => model.HospitalID) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.NHS_No_, "NHS No.", new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.EditorFor(model => model.NHS_No_) 
       @Html.ValidationMessageFor(model => model.NHS_No_) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.Forename, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.TextBoxFor(model => model.Forename, new { onkeyup = "InputToUpper(this);", Name="Forename"}) 
       @Html.ValidationMessageFor(model => model.Forename) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.Surname, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.TextBoxFor(model => model.Surname, new { onkeyup = "InputToUpper(this);" }) 
       @Html.ValidationMessageFor(model => model.Surname) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.DOB, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.TextBoxFor(model => model.DOB, new { @Value = "dd/MM/yyyy" }) 
       @Html.ValidationMessageFor(model => model.DOB) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.Active, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.EditorFor(model => model.Active) 
       @Html.ValidationMessageFor(model => model.Active) 
      </dd> 

      <dt> 
       @Html.LabelFor(model => model.Deceased, new { @class = "control-label col-md-2" }) 
      </dt> 

      <dd> 
       @Html.EditorFor(model => model.Deceased) 
       @Html.ValidationMessageFor(model => model.Deceased) 
      </dd> 

     </dl> 



     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 


<script> 
    function InputToUpper(obj) { 
     if (obj.value != "") { 
      obj.value = obj.value.toUpperCase(); 
     } 
    } 
</script> 

<script> 
    $("button[name='button']").click(function (event) { 
     event.preventDefault(); 
     var uquery = $('#HospitalID').val(); 
     var url = '@Url.Action("GetData")'; 
     var data = { value: uquery } 
     $.ajax({ 
      url: url, 
      data: data, 
      success: function (data) { 
       $('#Forename').val(data.HospitalID); 
      } 
     }); 
    }) 
</script> 



<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

Фактический код для класса

> public class Lkup 
>  { 
>   public string HospitalID { get; set; } 
>   public string NHS_No_ { get; set; } 
>   public string Forename { get; set; } 
>   public string Surname { get; set; } 
>   public System.DateTime DOB { get; set; } 
>  } 

HttpGet код в контроллере

[HttpGet] 
     public JsonResult GetData(string value) 
     { 
      var result = new Lkup(); 

      string connect = "Server=server\\instance;Database=SQLtable;Trusted_Connection=True"; 
      string query = "select * from table1 where pkey =" +value; 

      using (SqlConnection sql1 = new SqlConnection(connect)) 
      { 
      sql1.Open(); 
      SqlCommand cmd = new SqlCommand(query); 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      {  if (rdr != null) 
        { 
         while (rdr.Read()) 
         { 
          result.HospitalID = "column1"; 
          result.Forename = "column2"; 
          result.Surname = "colum3"; 
         } 
        } 
      rdr.Close(); 
      } 
      sql1.Close(); 
      } 

      return Json(result, JsonRequestBehavior.AllowGet); 
     } 

***** UPDATE *****

Я думаю, что код теперь fin e, мы протестировали некоторые предупреждения javascript, и они потянули правильное поле и данные. Проблема, кажется, в вызове ajax, так как при попытке маршрутизации до контроллера он получает 404. Как это:

GET http://localhost:59845/oncologyPatientsController/GetData?id=1234567 404 (Not Found) 
send @ jquery-1.10.2.min.js:23 
x.extend.ajax @ jquery-1.10.2.min.js:23 
(anonymous function) @ Create:157 
x.event.dispatch @ jquery-1.10.2.min.js:22 
v.handle @ jquery-1.10.2.min.js:22 
+0

Строка 'Строка запроса =«SELECT val.1, val.2, val.3, val.4 ОТ [SQL1 \\ INSTANCE] .dB.dbo .tbl1 AS L INNER JOIN [SQL1 \\ INSTANCE] .dB.dbo.SID AS S ON 1.ui = 2.ui WHERE val.1 = "+ value;" подходит для SQL Injection, серьезной проблемы безопасности. См. Http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-1.html в качестве отправной точки. –

+0

Спасибо. Я просто пытаюсь получить там функциональность, затем затвердеет по мере необходимости. – Amble

+0

Что не работает? И почему вы добавляете 'new {Name =" HospitalID "}' и т. Д.? - значение атрибута 'name' уже есть' HospitalID'. И '$ ('Forename'). Val (data.HospitalID);' wont do anything - ему нужно будет '$ ('# Forename'). Val (data.HospitalID);' –

ответ

2

То, что я обычно делаю следующее, чтобы получить ActionMethods URL в коде JS:

<button type="button" value="find">Find</button> 
<script> 
    $("button").click(function(event) 
    { 
     event.preventDefault(); 
     var uquery = $('HID').val(); 
     var url = '@Url.Action("GetData","ControllerName")'; 
     var data = { value: uquery } 
     $.ajax({ 
      url: url, 
      data: data, 
      success : function(data) 
      { 
       $('HID').val(data.Value1); 
      } 
     });}) 

Но, как упоминалось Hackerman, если ваша точка зрения принадлежит к этому контроллеру вы можете просто сделать:

@Url.Action("GetData") 
+0

Принимал это как ответ, поскольку он содержал определенную строку в примере и был отправлен первым, если я правильно читаю.Дальнейшие проблемы, с которыми я столкнулся, заключались в том, что я добавлял Controller к имени контроллера: var url = '@ Url.Action («GetData», «ControllerName»); – Amble

0

Если вид принадлежит к одному контроллеру нужно просто изменить ваш код немного:

var url = 'GetData'; 

Если посмотреть в другой контроллер, то это должен работы:

var url = '<%=ResolveUrl("~/YouControllerName/GetData")%>'; 
-1

Вы должны использовать имя класса контроллера вместо YourControllerName, GetData это имя действия , в твоем случае.

@Url.Action("actionName", "controllerName") 

возвращает URL-адрес действия.

e.g: 
var url = '@Url.Action("GetData", "YourControllerName")'; 

Попробуйте это:

<script> 
>  $("button[name='button']").click(function (event) { 
>   event.preventDefault(); 
>   var uquery = $('#HospitalID').val(); 
>   var url = '@Url.Action("GetData")'; 
>   var data = { value: uquery } 
>   $.ajax({ 
>    url: url, 
>    data: data, 
>    success: function (result) { 
>     $('#Forename').val(result.hid); 
>    } 
>   }); 
>  }) </script> 
+0

Пробовал несколько и все, похоже, проверять, но, похоже, ничего не стреляет. Я не получаю никакой обратной связи с нажатой кнопки, но ничего не происходит. У вас будет беспорядок с скрипачом и т. Д. – Amble

+0

$ ('HID'). Val (data.Value1); Недействительный код. В возвращаемых данных нет свойства Value1. Если у вас есть элемент HTML с идентификатором «HID», вы должны использовать $ ('# HID'). Val (data.Hid); –

+0

Поделитесь своим кодом cshtml. –