Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 43

0
votes
answers
12 views
+10

如何在asp.net webforms中啓動一個新的長時間線程?

0

我們有一個排名列表方法,需要5個小時才能完成。如何在asp.net webforms中啓動一個新的長時間線程?

我們將列表緩存在內存緩存中,但當緩存過期時,它會阻止所有請求。

所以我想同時緩存memcache中的列表和緩存時間,並設置一個很長的過期時間。

每次會從內存緩存列表中,該方案還檢查緩存時間,如果超過1小時,該程序將啓動一個新的線程,其再生等級表,程序將立即返回舊名單,

所以,程序中沒有任何阻止。

問題是,它是否正確開始在asp.net中的新腳步?如果新線程在aspx線程響應結束時被終止?

如何解決傳播緩存鎖?我們使用3個iis服務器

沙发
0
0

您可以在Global.asax中使用App_Start來獲取與請求無關的線程,但您應該意識到它仍然存在限制(例如,工作池可能會在一段時間)。

看看這裏瞭解更多信息:http://www.informit.com/articles/article.aspx?p=25722&seqNum=8

板凳
0
0

您必須首先提高應用程序的超時時間,您可以在配置文件中設置。 爲了不要斷開

<system.web> 
    <sessionState timeout="60"></sessionState> 
</system.web> 

鏈接:http://msdn.microsoft.com/fr-fr/library/system.web.sessionstate.httpsessionstate.timeout(v=vs.80).aspx

緩存,您可以使用不同的持久高速緩存系統:如果你使用Cache可以爲時間設定時間跨度會議,高速緩存或應用

堅持

鏈接:http://msdn.microsoft.com/fr-fr/library/system.web.caching.cache.aspx

地板
0
0

我認爲你應該使用http處理程序。
http://msdn.microsoft.com/en-us/library/ms228090%28v=vs.100%29.aspx
它作爲一個線程,您可以訪問任何東西session,cache等。
爲此,您將不得不使用IRequiresSessionState
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

你可以從任何地方調用它。
code behind或從jquery

0
votes
answers
11 views
+10

爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

0

我有一個HttpPut API方法,用於編輯它傳遞併成功保存到數據庫中的對象。這工作正常,但是從我的MVC應用程序,我用來調用我的API Put方法的httpClient.PutAsync返回內部服務器錯誤,即使API Put方法沒有。爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

我不知道什麼錯誤,API方法工作正常,但不知何故MVC的HttpClient仍然得到一個內部服務器錯誤。

API put方法

[HttpPut] 
    public IActionResult Put([FromBody] School school) 
    { 
     try 
     { 
      var schoolExists = _schoolRepository.SchoolExists(school.Id); 

      if (!schoolExists) return NotFound(); 

      if (!ModelState.IsValid) return BadRequest(); 

      var schoolData = Mapper.Map<School, Data.School>(school); 

      var updatedClass = _schoolRepository.UpdateSchool(schoolData); 

      if (!updatedClass) return Json(GetHttpResponseMessage(HttpStatusCode.InternalServerError)); 

      var route = CreatedAtRoute("GetSchool", school); 

      return route; 
     } 
     catch (Exception e) 
     { 
      return LogException(e); 
     } 
    } 

上述方法,工作正常,我的改變被保存到數據庫中,CreatedAtRouteResult對象從API方法返回。上述

MVC的HttpClient

public async Task<T> PutObject(string path, T content, string accessToken) 
    { 
     using (var httpClient = new HttpClient()) 
     { 
      try 
      { 
       SetBaseUri(httpClient, accessToken); 

       var serialisezContent = CreateHttpContent(content); 

       var httpResponse = await httpClient.PutAsync(path, serialisezContent); 

       if (httpResponse.StatusCode == HttpStatusCode.InternalServerError) throw new Exception("Problem accessing the api"); 

       return JsonConvert.DeserializeObject<T>(GetResult(httpResponse)); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

    } 

的方法,其中是問題是,這條線var httpResponse = await httpClient.PutAsync(path, serialisezContent);仍返回內部服務器錯誤。我的POST有相同的實現,並且工作得很好。

SETBASEURI()

private void SetBaseUri(HttpClient httpClient, string accessToken) 
    { 
     httpClient.BaseAddress = new Uri(BaseUri); 
     httpClient.DefaultRequestHeaders.Authorization = 
      _authenticationHeaderValueCreator.CreateAuthenticationHeaderValue("bearer", accessToken); 
    } 

CreateHttpContent()

public ByteArrayContent CreateHttpContent<TParam>(TParam httpObject) 
    { 
     var content = JsonConvert.SerializeObject(httpObject); 
     var buffer = System.Text.Encoding.UTF8.GetBytes(content); 
     var byteContent = new ByteArrayContent(buffer); 

     byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

     return byteContent; 
    } 
沙发
0
0

我敢打賭,你的API Put方法確實有消息No route matches the supplied values返回HTTP 500錯誤。你可以在Fiddler中檢查它。

而問題是具有以下線:

var route = CreatedAtRoute("GetSchool", school);

CreatedAtRoute方法以一個路徑名作爲第一個參數。我懷疑你有一條名爲GetSchool的路線。這是相同控制器中的一個操作名稱。而且CreatedAtRoute不會爲未知路由拋出異常,它只會返回500個錯誤碼。

要解決此問題,使用CreatedAtAction方法,而不是CreatedAtRoute

var route = CreatedAtAction("GetSchool", school); 
板凳
0
0

我認爲這個問題是從API的結果是失敗的序列化。嘗試在單元測試中手動序列化結果並查看失敗的位置。

0
votes
answers
9 views
+10

基於HTTP動詞的路由動作?

0

我想基於在Startup.cs通過下面的代碼HTTP動詞得到ASP.NET的Core 2 MVC路由的行動:基於HTTP動詞的路由動作?

 app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "post", 
       template: "api/{controller}/{id?}", 
       defaults: new { action = "Post" }, 
       constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("POST") }) 
      ); 
      routes.MapRoute(
       name: "delete", 
       template: "api/{controller}/{id?}", 
       defaults: new { action = "Delete" }, 
       constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("DELETE") }) 
      ); 
      routes.MapRoute(
       name: "default", 
       template: "api/{controller}/{action=Get}/{id?}"); 
     }); 

也就是說,

  • 如果客戶端請撥打GET http://example.com/api/foo,在我的FooController : Controller類上運行Get()方法。
  • 如果他們呼叫GET http://example.com/api/foo/123,那麼在我的FooController : Controller類上運行Get(int id)方法。
  • 如果他們呼叫POST http://example.com/api/foo,那麼在我的FooController<T> : Controller類上運行Post([FromBody] T postedItem)方法。
  • 如果他們呼叫POST http://example.com/api/foo/123,那麼在我的FooController<T> : Controller類上運行Post(int id, [FromBody] T postedItem)方法。
  • 如果他們叫DELETE http://example.com/api/foo/123,在運行Delete(int id)方法對我FooController : Controller

當我運行該項目,它似乎並沒有運行任何我的控制器。我有一些Razor頁面可以響應,但所有基於控制器的路由只返回404路由。即使默認路由似乎不起作用。

我一直在使用https://github.com/ardalis/AspNetCoreRouteDebugger試圖幫助我縮小問題的範圍,但我仍然沒有發現問題。它將控制器上的方法顯示爲可用操作,但未列出通過MapRoute添加的任何名稱,模板或約束。我很高興知道任何其他有用的工具。

FWIW,我試圖使用相同的動詞限制如下: https://github.com/aspnet/Routing/blob/2.0.1/src/Microsoft.AspNetCore.Routing/RequestDelegateRouteBuilderExtensions.cs#L252-L268

+0

什麼是'FooController的'?您無法直接路由到通用控制器,因爲Core在構建期間無法提供該類型。您可以將其用作基本控制器,但您必須路由到「實現」該類型的內容,即「BarController:FooControlller '。 –

+0

@ChrisPratt:這是一些僞代碼,旨在傳達各種控制器將期望不同的POST主體架構並接收各自類型的[FromBody]參數。我把把具體類型作爲方法參數一定沒問題 - 只是每個類都有相同的方法名稱,但期望不同的具體類型。附:我喜歡你的電影(也許你真的是克里斯普拉特?):https://www.youtube.com/embed/kj802AGE9Bg?start=22&end=25 – steamer25

沙发
0
0

所以我不記得到底是什麼問題原來是,但元的解決方案是,你可以調試路由通過將日誌級別從「信息」增加到「調試」來解決問題。例如,通過appsettings.json:

{ 
    "Logging": { 
    "Debug": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    }, 
    "Console": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    } 
    } 
} 

...然後你會得到這樣的例如,Visual Studio中的應用程序輸出窗格中的消息:

[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteConstraintMatcher[1] 
     Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
Microsoft.AspNetCore.Routing.RouteConstraintMatcher:Debug: Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteBase[1] 
     Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
Microsoft.AspNetCore.Routing.RouteBase:Debug: Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Debug: Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
0
votes
answers
9 views
+10

C#模擬Request.Browser.MajorVersion使用RhinoMocks

2

我有在MVC控制器以下代碼:C#模擬Request.Browser.MajorVersion使用RhinoMocks

 var isIe6 = Request.Browser.Type.ToUpper().Contains("IE") && Request.Browser.MajorVersion < 7; 

我需要存根出使用犀牛製品的第二部分。我曾經嘗試這樣做:

HttpRequest.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(new HttpBrowserCapabilities 
     { 
      Capabilities = new Dictionary<string, string> 
      { 
       {"majorversion", "11"}, 
       {"MajorVersion", "11"}, 
       {"browser", "IE"}, 
       {"isMobileDevice","false"} 
      } 
     })); 

上面的代碼在代碼MajorVersion返回0。我也試過這個:

HttpRequest.Stub(a => a.Browser.MajorVersion).Return(11); 

這只是在安裝時引發異常,說瀏覽器需要設置。我也嘗試過與上面的HttpBrowserCapabilitiesWrapper相結合,但它仍然說瀏覽器需要設置。

如何在MVC中存根/模擬出Request.Browser.MajorVersion?

一些測試代碼,如果有人需要它:

private BasketController sut; 
    protected HttpRequestBase HttpRequest; 

    [Test] 
    public void ShowsMajorVersionDoesNotWork() 
    { 
     // Arrange 
     HttpRequest.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(new HttpBrowserCapabilities 
     { 
      Capabilities = new Dictionary<string, string> 
      { 
       {"majorversion", "11"}, 
       {"MajorVersion", "11"}, 
       {"browser", "IE"}, 
       {"isMobileDevice","false"} 
      } 
     })); 
     //HttpRequest.Stub(a => a.Browser.MajorVersion).Return(11); // Throws Exception 
     sut = new BasketController() 
     { 
      Url = new UrlHelper(new RequestContext(HttpContext, new RouteData()), new RouteCollection()) 
     }; 
     sut.ControllerContext = new ControllerContext(HttpContext, new RouteData(), sut); 


     // Act 
     var result = sut.Method(); 

     // Assert 
     Assert.That(result, Is.EqualTo("11")); // Fails, always returns 0 
    } 

下測試方法BasketController:

public string Method() 
    { 
     return Request.Browser.MajorVersion.ToString(); 
    } 
+0

請向我們展示[mcve](即顯示問題的最簡單的單元測試)。 – mjwills

沙发
0
2

您可以創建HttpBrowserCapabilities使用BrowserCapabilitiesFactory(如解釋here),使用IE11 user-agent string,並相似地,您可以使用正確的字符串嘲笑任何其他瀏覽器MajorVersion

public HttpRequestBase GetInterenetExplorer11StubRequest() 
{ 
    return GetBrowserCapabilitiesStub("Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"); 
} 

public HttpRequestBase GetBrowserCapabilitiesStub(string userAgentString) 
{ 
    var browser = new HttpBrowserCapabilities 
    { 
     Capabilities = new Hashtable { { string.Empty, userAgentString } } 
    }; 
    var factory = new BrowserCapabilitiesFactory(); 
    factory.ConfigureBrowserCapabilities(new NameValueCollection(), browser); 
    var request = MockRepository.GenerateStub<HttpRequestBase>(); 
    request.Stub(a => a.Browser).Return(new HttpBrowserCapabilitiesWrapper(browser)); 
    return request; 
} 
+1

我將這個標記爲答案,當它爲我編譯時,最後一行是錯誤的 – johnstaveley

+0

好點!我更新了代碼以創建具有存根瀏覽器屬性的HttpRequest存根 –

0
votes
answers
8 views
+10

替代在mvc .net核心應用程序中啓動線程?

0

我們製造工廠內部有多種儀器,它們以不同的速度將數據插入數據庫內的多個表格。替代在mvc .net核心應用程序中啓動線程?

每條生產線上都有一臺計算機連接到網頁上,操作員輸入分配的作業編號並顯示一些相關信息。

我們的目標是根據工廠設備插入的數據顯示指示。狀態與原材料可用性,倉庫存儲可用性,溫度範圍等有關。

我最初的想法是通過產生一條線來修改當前的MVC應用程序,每條生產線每隔10秒掃描插入的信息,並可能推送數據槽通過signarlR來建議操作員。我讀到MVC應用程序中的起始線程是一種不好的做法,可能會影響IIS管理線程的方式。

我想知道如果不使用單獨的線程,如何在MVC中承載獨立於快速回歸的進程?

謝謝你的時間!

沙发
0
0

是的,開始輪詢線程可能不是這裏最好的方法。我可能會建議的另一種解決方案是將您所謂的工具(即當前正在插入數據)修改爲SignalR客戶端,並在每次插入一些數據時向服務器廣播一條消息。然後SignalR服務器可以簡單地將此消息廣播到與之連接的JavaScript SignalR客戶端。通過這種方式,您可以在生產數據的儀器和可以實時顯示此數據的瀏覽器客戶端之間實現(通過SignalR服務器)的直接通信。

+0

對不起,我會添加更多信息。這些設備使用梯形圖編程的PLC,這是工業和實時的。它確實支持數據庫上的CRUD操作。 –

+0

此外,我想保留服務器上的業務規則計算,因爲我們正在越來越多地將數據集成到其他系統(如ERP)。 –

+0

然後,您可能想要抽象一些您的設備將調用的API背後的CRUD操作,以便您可以輕鬆地通知SignalR服務器關於傳入更新。相信我,你完全不希望在ASP.NET應用程序中產生輪詢線程。這就像想要在腳下開槍一樣。 –

0
votes
answers
7 views
+10

一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

1

我有一個運行在從其他站點下載圖像文件的asp.net web api中運行的代碼。一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

這是我用來下載圖像的代碼。

 foreach (string file in images) 
     { 
      using (WebClient client = new WebClient()) 
      { 
       await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
      } 
     } 

我真正需要做的是立即開始10次下載。 (例如使用Task.Run ...或者其他方式),然後在最初開始的10逐個完成時逐個開始休息。

For EX。

啓動10個任務

等到了10個任務完成一個

1次時完成,啓動另一個任務

當其他1次完成,啓動另一個任務等等

直到下載列表中的所有圖像。

所以我的代碼運行時最多有10周併發下載量(或小於10,如果沒有更多的圖像被下載。)

我使用.NET 4.5.2

你們可以指出我在正確的方向來實現這一目標嗎?

+0

這不是說這回答你的問題,而是看看Hangfire http://hangfire.io/ - 看起來像是你的需求的完美契合 – 2014-10-10 11:19:04

+0

你可能需要啓動10個任務,然後使用Task .WaitAny(taskList)' – artm 2014-10-10 11:22:42

沙发
0
2

您可以使用SemaphoreSlim扼殺異步工作方式:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10); 

... 

var downloads = images.Select(file => DownloadAsync(file)); 
await Task.WhenAll(downloads); 

... 

private async Task DownloadAsync(string file) 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    using (WebClient client = new WebClient()) 
    { 
     await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
    } 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

注:

  • 您可能需要調整System.Net.ServicePointManager.DefaultConnectionLimit
  • 您應該避免在ASP.NET上使用Task.Run。請參閱我的recent MSDN article on async ASP.NET瞭解更多詳情。
+0

很好的答案。謝謝 :) – Amila 2014-10-11 17:50:20

板凳
0
0

我有點想大聲這裏,不知道這是否會工作,別人會希望它改善:

private void startFirst10Tasks() 
{ 
    List<Task> tasks = new List<Task>(); 
    //tasks.Add first 10 tasks 
    taskHandler(tasks); 
} 

private void taskHandler(List<Task> tasks) 
{ 
    Task.Factory.ContinueWhenAny(tasks, winner => 
     { 
      getNewTasks(tasks.Except(new List<Task>{winner})); 
     }); 
} 

private void getNewTasks(List<Task> tasks) 
{ 
    tasks.Add(
     Task.Factory.StartNew(() => 
     { 
      //Next DownloadFileTask 
     }) 
    ); 

    taskHandler(tasks); 
} 
0
votes
answers
7 views
+10

在另一個線程中調用ASP.NET Web服務

2

我們正在對某些數據更新進行Web服務調用以同步另一個數據庫。此Web服務調用需要一些響應時間。將它添加到線程中有幫助嗎?這樣做的任何垮臺?如果Web服務調用失敗,則失敗,就是這樣。這就像一場火災,忘記呼叫。在另一個線程中調用ASP.NET Web服務

+0

Mike ..客戶端是Windows應用程序還是Web應用程序?如果Windows應用程序可以安全地進行異步調用。這比使用線程更安全。但對於Web應用程序..我建議不要,而是使用Ajax。 – Bhuvan 2012-01-05 21:14:20

+0

這是一個web應用程序回發或ajax。 – 2012-01-05 21:16:35

沙发
0
2

您可以使用異步Web服務調用使用異步回調來防止阻塞您的主線程。

通過向Web服務的異步調用,您可以繼續使用 調用線程,而你等待Web服務響應。 這意味着用戶可以繼續與應用程序 進行交互,而不會在Web服務訪問進行時鎖定它。

從MSDN:Making Asynchronous Web Service Calls

板凳
0
2

如果花費足夠長的時間來掛起用戶界面,那麼建議在另一個線程上調用它。

地板
0
2

除了都鐸王朝的回答,我建議您從.NET 4.0.from任務並行庫中使用新的Task類開始。例如:

Task backgroundProcess = new Task(() => 
{ 
    service.CallMethod(); 
}); 
+1

用於提示「任務」解決方案 – 2012-01-09 12:03:25

4楼
0
0

我強烈建議不要使用異步調用Web服務(包括製造在單獨的線程調用)從一個Web應用程序。而應使用其他方法(如Ajax),並從Ajax Call實例調用此webservice調用。在Web上下文中處理線程和異步調用沒有簡單的方法。

0
votes
answers
7 views
+10

Asp.net MVC - 第二次嘗試打開模式窗口後的錯誤

1

我試圖在打開詳細信息時實現引導模式窗口。模態窗口在ajax調用中打開。問題是,我只能打開一次。它會打開整個模板,但它不應該與第二次嘗試過程中出現了錯誤:Asp.net MVC - 第二次嘗試打開模式窗口後的錯誤

Uncaught error: modal is not a function

然後我得到這個錯誤,無法打開模態窗口了。

的容器的主視圖:

<div id="data-container"> 
    @Html.Action("PartialDisplay", "Disp") 
</div> 

我顯示在局部視圖中的所有數據,因此控制器看起來像這樣:

public ActionResult Display() 
     { 
      return View(); 
     } 
     public PartialViewResult PartialDisplay(int[] checkId) 
     { 
      if (checkId == null) 
      { 
       [my code] 
       return PartialView(viewModel); 
      } 

詳細視圖:

@{ 
    ViewBag.Title = "PartialDisplay"; 
    Layout = null; 
} 

<!-- Modal --> 
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> 
    <div class="modal-dialog" role="document"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <h5 class="modal-title" id="exampleModalLabel">Detail</h5> 
       <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 
        <span aria-hidden="true">&times;</span> 
       </button> 
      </div> 
      <div class="modal-body" id="modalContent"> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> 
      </div> 
     </div> 
    </div> 
</div> 

<table class="table"> 
    <thead> 
     <tr> 
      <th>Nazev Jidla</th> 
      <th>Kategorie</th> 
      <th>Akce</th> 

     </tr> 
    </thead> 
    <tbody> 
     @foreach (Jidlo jidlo in Model.Jidlos) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => jidlo.name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => jidlo.Category.popis) 
       </td> 
       <td> 
        @Html.ActionLink("Edit", "Edit", new { id = jidlo.JidloID }) | 
        @Ajax.ActionLink("Details","Details", new { id = jidlo.JidloID }, new AjaxOptions(){ UpdateTargetId = "modalContent", InsertionMode = InsertionMode.Replace, OnBegin = "openModalWindow" }) | 
        @Html.ActionLink("Delete", "Delete", new { id = jidlo.JidloID }, new { onclick = "return confirm('opravdu smazat polozku " + jidlo.name + "?');" }) 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

<script type="text/javascript"> 
    function openModalWindow() { 
     $('#myModal').modal("show"); 
    } 
</script> 

控制器動作:

public ActionResult Details(int id = 0) 
     { 
      Jidlo jidlo = db.Jidlos.Find(id); 
      if (Request.IsAjaxRequest()) 
      { 
       return PartialView(jidlo); 
      } 
      else { 
      return View(jidlo); 
      } 
     } 

佈局腳本包括:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
<script src="@Url.Content("~/Scripts/jquery-3.2.1.js")"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 
<script src="@Url.Content("~/Scripts/bootstrap.js")"></script>  

缺少什麼我在這裏?我試圖改變加載的優先級,並添加更多的東西,比如將jQuery.noConflict添加到腳本中,但仍然沒有任何結果。

沙发
0
0

問題是加載jQuery腳本兩次

<script src="@Url.Content("~/Scripts/jquery-3.2.1.js")"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 
<script src="@Url.Content("~/Scripts/bootstrap.js")"></script>  

這是正確的。

另一個是刪除細節視圖中的模板標記。

0
votes
answers
7 views
+10

隱式轉換 - mvc應用程序

0

請在C sharp中尋求一些關於類型轉換的幫助。我正在使用MVC和Entity Framework核心創建一個應用程序。現在我正在實現身份驗證,但是當我創建異步方法時,出現錯誤「無法隱式地將類型'GymBuddy.Data.Entities.RepoUser'轉換爲'System.Threading.Task.Task'。 我已閱讀了一些文章關於類型轉換,但我仍然不清楚這個問題。不一定尋找答案,但也許一些方向如何進一步探索這個問題。在此先感謝。隱式轉換 - mvc應用程序

首先,我創建了RepoUser類與幾個簡單屬性。

using Microsoft.AspNetCore.Identity; 
namespace GymBuddy.Data.Entities 
{ 
public class RepoUser : IdentityUser 
    { 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    } 
} 

其次,我創建了一個類,將在未來的種子數據庫,但也將檢查用戶是否存在。

using GymBuddy.Data.Entities; 
using Microsoft.AspNetCore.Identity; 
using System.Threading.Tasks; 

namespace GymBuddy.Data 
{ 
public class GymBuddySeeder 
{ 
    private readonly UserManager<RepoUser> _userManager; 
    public GymBuddySeeder(UserManager<RepoUser> userManager) 
    { 
     _userManager = userManager; 
    } 
    public async Task Seed() 
    { 
     var user = _userManager.FindByEmailAsync("[email protected]"); 
     if (user == null) 
     { 
      user = new RepoUser() 

一旦I型「RepoUser」(在這裏基本上與第一行)上述錯誤信息彈出。

在此先感謝。

+0

假設FindByEmailAsync實際上是一個異步方法,它可能會返回一個Task。這意味着用戶是一個任務而不是回購用戶。因此,當您嘗試將用戶(任務)設置爲新的RepoUser時,您會遇到不存在隱式轉換的類型不匹配。 – Kevin

沙发
0
2

變化

var user = _userManager.FindByEmailAsync("[email protected]"); 

var user = await _userManager.FindByEmailAsync("[email protected]"); 

AsyncFindByEmailAsync結束表明,它可能返回Task<RepoUser>。不要拿我的話說,當然,看看它的回報。

調用方法返回任務。等待異步值返回任務返回的值。

+0

他遇到問題的路線仍然是問題。他仍然無法設置user = new RepoUser()。 – Kevin

+0

如果*'RepoUser'可分配給'FindByEmailAsync'返回的任何類型,它將不會成爲問題。 –

+0

@Kevin'FindByEmailAsync'應該返回RepoUser可能的身份用戶。 FindByEmailAsync是通用'UserManager '的一部分 - 並且缺少一些應該實現的自定義實現。 – NSGaga

0
votes
answers
7 views
+10

使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

1

我正在將數組從視圖傳遞到使用Ajax的控制器,但操作時數組顯示爲空。使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

這是我的代碼:

查看

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values: arr["48","47","46"] }, 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 

行動

public ActionResult array(string[] Values) 
     { 
      for (int id = 0; id < Values.Length; id++) 
      { 
       string newID = Values[id]; 
      } 

     return View(); 
    } 
+0

'數據:{值: 「48」, 「47」, 「46」]},'和'加上傳統:真實;' –

+1

和動作方法的名字是'array',你在呼喚來自客戶端腳本的其他內容!!! – Shyju

沙发
0
1
jQuery.ajaxSettings.traditional = true; 

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values:["48","47","46"]},//just edit this line 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 
+0

動態創建該數組使用jquery和數組創建成功,如果我這樣發送數組({值:arry.join(',')})arry有值,但是當我發送像這樣的數組({值:arry} )其顯示空陣列? –

+0

data:{Values:arry} –

板凳
0
1

您的代碼對於你是如何發送數據的一些問題!當你執行這個表達式時你期望什麼arr["48","47","46"] ?????這將給你undefined,這就是你想要發送!

有兩種方法可以修復您的代碼。您可以在請求正文中發送數組。爲此,您需要從數組中創建一個JSON字符串,並將其作爲data屬性發送,同時將請求內容類型標頭值顯式指定爲「application/json」。您可以使用JSON.stringify方法來獲取js數組的JSON字符串。

此外,請確保您正在調用正確的操作方法。在您的問題中,您分享了array操作方法代碼,但在您的客戶端腳本中,您嘗試調用不同的操作方法(「複選框」)!

這應該工作。

var arry = ["48", "47", "46"]; 
var url = "@Url.Action("array", "Main")"; // Update your real url here 
// If your script is inside the razor view, you can us Url.Action (c#) method 

$.ajax({ 
    type: "Post", 
    url: url , 
    data: JSON.stringify(arry), 
    contentType: "application/json", 
    success: function(r) { 
     alert("Success"); 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 

另一種選擇是發送javascript對象與屬性Values(其具有數組作爲它的值)作爲$.ajax呼叫的數據屬性值。現在請求內容類型頭將爲application/x-www-form-urlencoded;,並且該數組將在請求中作爲FormData發送。

var arry = ["48", "47", "46"]; 

$.ajax({ 
    type: "Post", 
    url: "/Main/array", 
    data: { Values: arry }, 
    success: function(r) { 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 
+0

動態創建該數組並使用jquery,並且數組已成功創建,如果我發送數組,如下所示({Values:arry.join(',')})arry具有值,但是當我發送數組像這樣({Values:arry})其顯示空數組? –

+0

我剛剛用MVC5應用程序,jquery 3.2.1測試瞭解決方案的第二部分,它對我很有幫助。你有沒有嘗試第一個解決方案? – Shyju