2016-06-26 1 views
1

Как я могу получить значение от ajax до метода контроллера mvc в 'FileStreamResult' в mvc? Я хочу передать значение от <a href="#" id="fileId">@Model[i].ToString()</a> контроллеру ajax.Как связаться с Ajax контроллеру со значением pass?

Контроллер

 public ActionResult Index() 
    { 
     IEnumerable<VmFile> model = _manager.fileName(); 
     return View(model); 
    } 
    public ActionResult Upload(HttpPostedFileBase file) 
    { 
     try 
     { 
      if (file.ContentLength > 0) 
      { 

       var fileName = Path.GetFileName(file.FileName); 
       var path = Path.Combine(Server.MapPath("~/File/"), fileName); 
       file.SaveAs(path); 
       _manager.UploadFile(file, path.ToString()); 
      } 
      ViewBag.Message = "Upload successful"; 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      ViewBag.Message = "Upload failed"; 
      return RedirectToAction("Index"); 
     } 
    } 
public FileStreamResult GetFile(int Id) 
{ 
    string fileName = _manager.FileName(Id); 
    string filePath = ConfigurationManager.AppSettings["FilePath"] + fileName; 
    FileStream fs = new FileStream(Server.MapPath(filePath), FileMode.Open, FileAccess.Read); 
    return File(fs, "application/pdf"); 
} 

FileManager

public string FileName (int id) 
    { 
     string fileName = _unitOfWork.FileRepository.Get(r => r.Id == id).Select(f => f.Name).First(); 
     return fileName; 
    } 

    public IEnumerable<VmFile> fileName() 
    { 
     var file = _unitOfWork.FileRepository.Get(); 

     var model = from r in file 
        select new VmFile 
        { 
         Id = r.Id, 
         Name = r.Name, 
         ThanaId =r.ThanaId, 
         RoadId = r.RoadId, 
         Url = r.Url, 
         UpLoadDate = r.UpLoadDate, 
         FCategoryId = r.FCategoryId, 
         FileType = r.FileType 
        }; 

     return model; 
    } 
    public void UploadFile(HttpPostedFileBase file,string path) 
    { 

     string fName = file.FileName; 
     string[] typ = fName.Split('.');//Regex.Split(fName, @"."); 
     File newFIle = new File 
     { 
      Name = fName, 
      Url = path, 
      FCategoryId = 1, 
      ThanaId = 23201, 
      RoadId = 12, 
      FileType = typ[1], 
      UpLoadDate = DateTime.Now 
     }; 
     _unitOfWork.FileRepository.Insert(newFIle); 
     _unitOfWork.Save(); 
    } 

VmFile

public class VmFile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Url { get; set; } 
    public Nullable<short> BridgeId { get; set; } 
    public Nullable<DateTime> UpLoadDate { get; set; } 
    public Nullable<double> FromChain { get; set; } 
    public Nullable<double> ToChain { get; set; } 
    public string FileType { get; set; } 
    public Nullable<int> FCategoryId { get; set; } 
    public Nullable<int> ThanaId { get; set; } 
    public Nullable<int> RoadId { get; set; } 
} 

Посмотреть

@model IEnumerable<RSDMS.ViewModel.VmFile> 
@{ 
Layout = null; 
} 
<html> 
<head> 
<link href="~/Content/bootstrap-theme.min.css" rel="stylesheet" /> 
<link href="~/Content/bootstrap.min.css" rel="stylesheet" /> 
<meta name="viewport" content="width=device-width"/> 
<title>Index</title> 
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 

    </head> 

    <body> 
     <div id="header" class="container"> 
      <h2>Document Module</h2> 
      <div class="panel panel-default"> 
       <div id="h2" class=" panel panel-primary "><h4  id="h4">Document Type</h4></div> 
       <div id="form" class=" panel-body"> 
        <form role="form"> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">A-Road Related 
         </label> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">B-Road+Structure Relate 
         </label> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">C- 
         </label> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">Option 1 
         </label> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">Option 2 
         </label> 
         <label class="checkbox-inline"> 
          <input type="checkbox" value="">Option 3 
         </label> 
        </form> 
       </div> 
      </div> 
      <div id="listpanel" class="panel-primary"> 
       <h1>List Panel</h1> 
       <div id="file"> 
        <table> 
         <th>File Name</th> 
         @foreach (var file in Model) 
       { 
        <tr> 
           <td> 
            <li> 
           <a href="#" id="fileId">@file.Name</a> 
            </li> 
           </td> 
          </tr> 
        <br /> 
       } 
        </table> 
       </div> 
       @using (Html.BeginForm("Upload", "Document", FormMethod.Post, new {enctype = "multipart/form-data"})) 
     { 
     <label class="btn btn-block btn-primary"> 
       Browse &hellip; <input type="file" name="file" id="file" style="display: none;"> 
        </label> 
      <input type="submit" class="btn" value="Upload"> 
     } 
      </div> 

      <div id="frame" class="panel-body"> 
       <div id="frame"> 
        <iframe src="@Url.Action("GetFile", "Document")" width="900px" height="500px"></iframe> 
       </div> 
      </div> 
     </div> 
    </body> 
    </html> 

    <style> 
     #h2 { 
      background-color: lightblue; 
      height: 40px; 
     } 
#h4 { 
    margin-left: 20px; 
} 
#header { 
    margin-left: 50px; 
    margin-right: 50px; 
} 
#frame { 
     float: right; 
    margin-bottom: 50px; 
} 
#listpanel { 
     float: left; 
} 
    </style> 

    <script> 
     $(document).ready(function(e) { 
      // var p = { Data: $('#fileId').val() }; 
      //var currentDataItem = this.dataItem(this); 
      //id = currentDataItem.Id; 
      alert($('#fileId').attr('id')); 
      var p = { Data: $('#fileId').val() }; 
      alert(p); 
      var id = $('#fileId').text(); 
      alert(id); 
      $('#fileId').click(function() { 
       $.ajax(
       { 
        //url: '@Url.Action("GetFile", "Document")?id=' + id, 
        url: '/Document/GetFile', 
        type: "POST", 
        data: {Id:id}, 
        success:function(data) 
        { 
        }, 
        error:function(e) 
        { 
        } 
       }); 
      }) 
     }); 

</script> 
+0

У меня есть определенные запросы, которые следует задать, Является ли метод ActionResult post, и вы упомянули плагин jQuery в файле bundle.config или где-нибудь в вашем приложении. –

+0

Да, это результат действия, который я имею в виду. FileStreamResult GetFile() - это метод httppost, и я уже добавляю этот скрипт

+0

Если вы добавили плагин jQuery, сообщите мне версию плагин. –

ответ

0

Ваш Javascript код должен быть обернут в функции нагрузки JQuery, как это:

$(function() { 

//Paste all your java script here 

}); 

Это было единственное изменение, которое я сделал на моей стороне и вызов AJAX для GetFile в контроллере документа теперь работает

0

Как сказал Денис Вессельс вы должны приложить код JQuery внутри документа готового блока

$(document).ready(function() { 
    var currentDataItem = this.dataItem(this.select()); 
    id = currentDataItem.Id; 
    var p = { Data: $('#fileId').val() }; 
    $('#fileId').click(function() { 
     $.ajax(
     { 
      url: '@Url.Action("GetFile", "Document")?id=' + id, 
      //url: '/Document/GetFile', 
      type: "POST", 
     // data: {Id:id}, 
      success:function(data) 
      { 
      }, 
      error:function(e) 
      {      
      } 
     }); 
    }) 
}); 
+0

Он не вызывается контроллеру. Ошибка показывает «Uncaught ReferenceError: $ не определен». Пожалуйста, что еще? –

+0

Возможно, вы забыли добавить файл jquery '' –

+0

Я уже добавляю этот скрипт, но он не получить значение perametar для контроллера. –

0

Первых всего позвольте мне исправить некоторые ошибки в коде. В поле зрения не передано никакого идентификатора, который может быть передан в методе действий. Так как в классе FileManager изменить ReturnType метода GetData, как

Dictionary<int,string>

ИЛИ

создать класс модели говорят FileManagerModel следующим

public class FileManagerModel 
{ 
    public int ID {get;set;} 
    public string FileName{get;set;} 
} 

и изменить тип возвращаемого в

List<FileManagerModel> 

соответственно c висящий модель с точки зрения, как

@model Dictionary<int, string> // If the return type is Dictionary<int,string> 

, а затем в окне изменить свой цикл следующим образом

@foreach(var file in Model) 
        { 
         <tr> 
          <td> 
           <li> 
            <a href="#" id="fileId" data-id="@file.Key">@file.Value</a> 
           </li> 
          </td> 
         </tr> 
         <br /> 
        } 

, а также изменить способ GetFile следующим

public FileStreamResult GetFile(int? id) 
     { 
      string fileName = "IFrameTest.txt"; 
      var t = ConfigurationManager.AppSettings["FilePath"]; 
      string filePath = ConfigurationManager.AppSettings["FilePath"] + fileName; 
      FileStream fs = new FileStream(Server.MapPath(filePath), FileMode.Open, FileAccess.Read); 
      return File(fs, "text/plain"); 
     } 

добавить обнуляемого Int аргумент в вашем методе, так как при загрузке страницы ваш идентификатор будет пустым.

В качестве метода по умолчанию является HttpGet метод в вашем Ajax позвонить вам необходимо сделать следующие изменения

<script> 
    $(document).ready(function(e) { 
     var id = $('#fileId').text(); 
     $('#fileId').click(function (event) { 
      event.preventDefault(); 
      var id = $(this).data("id"); 
      $.ajax(
      { 
        url: '@Url.Action("GetFile", "Document")', 
        type: "GET", 
        data: { id: id }, 
        success:function(data) 
        { 
        }, 
        error:function(e) 
        { 
        } 
       }); 
      }) 
     }); 

</script> 

Сделав эти изменения, которые работали для меня.Я надеюсь, что это будет исправить ваш вопрос

UPDATE

Если вы используете IEnumerable передать идентификатор атрибута данных, как

<a href="#" id="fileId" data-id="@file.Id ">@file.Name</a> 
+0

Я уже создал VmFile, который является вашим FileManagerModel.Is необходимо создать другой метод? Не могу понять, почему я использую словарь ? Позвольте мне прояснить это. –

+0

Но вы не использовали класс в любом месте. Модель (@model), которую вы объявляете в представлении, является типом возврата модели, которую вы возвращаете из метода Index. Поскольку вы не назначаете идентификатор данных из модели, и вы просто пытаетесь передать идентификатор из точки где нет метода GetFile через Ajax, я просто предложил вам использовать словарь

+0

Я отредактировал что-то изменение от Controller и FileManager. Пожалуйста, проверьте сейчас. –

Смежные вопросы